1.对象的创建(实例化)
Cat cat; //声明
cat = new Cat(); //开辟空间,把地址赋值给cat;
public class Cat {
String name=null;
int age=0;
String color=null;
/*
public Cat(String name, int age, String color) {//构造函数
this.name = name;
this.age = age;
this.color = color;
}*/
}
//======================cat.java=======================================
public class Hello {
public static void main(String[] args){
//Cat A=new Cat("小黑",5,"白色");//调用的构造函数
Cat B;
B=new Cat();
B.color="白色";
B.age=55;
B.name="小花";//普通调用cat对象,注意,当cat.java创建了构造函数时。就不能用此种方法了
}}
//======================Hello.java=======================================
注意:对象也是引用类型,和数组一样,两个数组相等,改变其一,另外一个的内容也会随之改变。
2.方法的封装与调用
类内部调用:
public class Hello {
public static void main(String[] args){
System.out.println(DecToHex(31));}
static String DecToHex(int num){
StringBuffer stringBuffer = new StringBuffer();
char []chars = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while (num>0){
int index= num % 16;//取余
char tmp = chars[index];//取出对应的十六进制的数值
stringBuffer.append(tmp);
num=num/16;
}
return stringBuffer.reverse().toString();};}
外部调用:
public class Cat {
static void test(){
System.out.println("123");
}
}
//=====================Cat.java========================
public class Hello {
public static void main(String[] args){
Cat cat1 = new Cat();
Cat.test();}}
//=====================Hello.java========================
3.static
- 静态属性(类属性)
静态属性可以通过 类名.属性名/对象.属性名 来赋值和访问
静态属性只有一份
静态属性生命周期与类相同,存储于堆中class实例的尾部(JDK7以上) - 实例属性(对象属性)
实例属性每个对象都有一份
实例属性只能通过 对象.属性名 来赋值和访问
实例属性生命周期与对象相同,存储于堆中 - 静态方法与实例方法(对象方法)
静态方法和实例方法都随着类一起加载,存储与方法区
静态方法可以通过 类名.方法名/对象.方法名 来访问
静态方法中只能调用静态方法,只能访问静态属性
实例方法中可以调用静态方法和实例方法,也可以访问静态属性和实例属性 - main方法
main方法可以直接调用所在类的静态方法或静态属性
main方法不能直接访问所在类中的实例成员,必须创建对象后,才能通过对象去访问 ```java public class Cat { static String color=null; } //=====================Cat.java======================== public class Hello { public static void main(String[] args){
}} //=====================Hello.java======================== //结论,用static修饰过后的变量,就像是个一辆共享单车,只有一辆,但是谁都可以使用,谁都可以改变他的值; //静态方法中,不能直接使用实例方法(先new一下);Cat cat1 = new Cat();
cat1.color ="白色" ;
System.out.println(cat1.color);//"白色"
Cat.color="黑色";
System.out.println(Cat.color);//"黑色"
<a name="CvN3l"></a>
#### 4.重载
概念:<br />同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同或者参数顺序不同即可; <br />与返回值类型无关,只看参数列表;
```java
public class Hello {
public static void main(String[] args){}
static int test(int a){return 1;};
static int test(double a){return 1;};
static int test(String a){return 1;};
}
5.可变参数
public class Hello {
public static void main(String[] args){
System.out.println(test(1,2,3,4,5));//传入参数可以为一个数组,传入数组的时候,就只能传入一个参数了
}
static int test(int ...a){//三个点代表可变参数 ,传入的a本质上是个数组
int result =0;
for (int i = 0; i < a.length; i++) {
result=result+a[i];
}
return result;
};
}
6.构造器/构造方法/构造函数
构造器名和类名一致,没有返回值
当对象创建的时候,会自动调用对应的构造器如果没有定义构造器,会自动生成默认的无参构造器(也叫默认构造器)
一个类可以定义多个不同的构造器,即构造器重载
一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非自己显式的定义一下
7.this
public class Cat {
String color=null;
public Cat(String color) {
this.color = color;
System.out.println(this.hashCode());}}
//=====================Cat.java========================
public class Hello {
public static void main(String[] args){
Cat cat1 = new Cat("白色");
System.out.println(cat1.hashCode());
System.out.println("==================");
Cat cat2 = new Cat("黑色");
System.out.println(cat2.hashCode());
}
}
//=====================Hello.java========================
/*
356573597 指向cat1
356573597
==================
1735600054 指向cat2
1735600054
*/
//说明谁调用,这个this就指向谁。
this用于区分当前对象的属性和局部变量
this不能在类外部使用,只能在类内部实例方法中使用;
this不能在静态代码块里面使用,因为静态代码块会随着对象的创建而加载,这是this并没有被谁指向;
this(实参列表):用于构造方法之间的访问,必须是构造器中的第一个语句,如一下代码:
public class Cat {
int num=0;
String color=null;
public Cat(String color) {
this(5,6);//调用点
this.color = color;
}
public Cat(int num,int num1) {
this.num=num;
System.out.println(1111);
}
}
//=====================Cat.java========================
public class Hello {
public static void main(String[] args){
Cat cat1 = new Cat("白色");
}
}
//=====================Hello.java========================
8.包
- 包的三大作用:
- 区分相同名字的类
- 当类很多时,可以很好的管理类
- 控制访问范围
- 建包
- 包,实际上就是创建不同的文件夹/目录来保存类文件
package com.dudu.app;
public class people {
String name=null;
public people(String name) {
this.name = name;
System.out.println(this.name );
}
}
//===============================package com.dudu.app;=======================
import com.dudu.app.people;
public class Hello {
public static void main(String[] args){
people people1 = new people("aaa");
}
}
//===============================Hello.java;=======================
9.访问修饰符
- 隐藏实现细节,使用的人只需知道传入什么参数,会产生什么效果,返回什么数据对属性进行操作时,可以验证传入数据的合理性把属性私有,定义公开的get、set方法来验证数据合理性;
封装例子: ```java package com.dudu.app; public class people { private String name=null; private int age =0;
public String getName() {
return name;
}
public void setName(String name) {
if(name.length()!=0){ this.name = name;System.out.println("将封装的变量私有化,然后通过方法进行访问操作,可以验证传入数据的合理性");
}
else {
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("将封装的变量私有化,然后通过方法进行访问操作,可以验证传入数据的合理性");
this.age = age;
} } //===============================package com.dudu.app;======================= import com.dudu.app.people; public class Hello { public static void main(String[] args){
people people1 = new people();
people1.setName("你好");
people1.setAge(55);
} } //===============================Hello.java;=======================
<a name="IVJvH"></a>
#### 11.继承
1. 作用
- 提高代码复用性
- 继承是多态的前提
2. 继承的语法
- class 子类 extends 父类{ }
- 例子
```java
package com.dudu.app;
public class people {
private String name=null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//===============================people.java;=======================
package com.dudu.app;
public class students extends people{
private boolean learn;
public boolean isLearn() {
return learn;
}
public void setLearn(boolean learn) {
this.learn = learn;
}
}
//===============================students.java;=======================
import com.dudu.app.students;
public class Hello {
public static void main(String[] args){
students students1 = new students();
students1.setName("实例化的是students,通关students继承people访问people里面的属性");
System.out.println(students1.getName());
}
}
//===============================Hello.java;=======================
12.父类构造器
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器(注:不用super的话,父类必定有无参构造器,不然报错)
- super();如果父类没有提供无参构造器,则须在子类构造器中用super去指定使用父类的哪个构造器 super(参数列表); super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
- 父类构造器的调用不限于直接父类,一直往上追溯到Object类(顶级父类)
- 访问父类的属性(受访问修饰符影响) super.属性名;
- 访问父类的方法(受访问修饰符影响) super.方法名(参数列表);
- 如果父类没有,super会向上找爷爷类,以此类推
- 如果父类和爷爷类都有,但是父类是private,那么也会报错
java: 无法从静态上下文中引用非静态 变量 super(),即无法从带有static的类里面调用父类或者爷爷类的属性或者方法; ```java package com.dudu.app; public class test { public String tttt=”ttttpppppppppp”; } //===============================test.java;======================= package com.dudu.app; public class people extends test{ public String TEST=”TEST_people”; private String name=null; public people() {
System.out.println("父类无参构造器");
} public people(String name) {
this.name = name;
System.out.println("父类有参数构造器"+this.name);
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
//===============================people.java;======================= package com.dudu.app; public class students extends people{ private boolean learn;
public students(boolean learn) {
super(" dudu");//指定调用父类有参数的构造器
this.learn = learn;
}
public boolean isLearn() {
return learn;
}
public void setLearn(boolean learn) {
this.learn = learn;
}
public void call() {
System.out.println(super.tttt);//ttttpppppppppp
}//这个就是,父类继承了爷爷类的属性,父类没有,也可以直接调用的;
} //===============================students.java;=======================
<a name="fb3hD"></a>
#### 13.方法重写
a) 方法重写也叫方法覆盖;<br />b) 子类方法的名称、参数,与父类完全相同;<br />c) 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类 ;比如父类返回类型是Object,子类方法返回类型是String <br />d) 子类方法不能缩小父类方法的访问权限,即访问修饰符;
```java
package com.dudu.app;
public class test {
public String tttt="tttt";
public String rename(){
return "方法重写_父类";
}
}
//===============================test.java;=======================
package com.dudu.app;
public class people extends test{
public String rename(){
return "方法重写_子类";
}
}
//===============================people.java;=======================
14.代码块
- 创建对象时的调用顺序
① 父类的静态代码块和静态属性初始化
② 子类的静态代码块和静态属性初始化
③ 父类的普通代码块和普通属性初始化
④ 父类的构造方法
⑤ 子类的普通代码块和普通属性初始化
⑥ 子类的构造方法