目录
如何初始化对象
通过前面的学习,我们知道,在java方法内部中定义一个局部变量必须初始化,否则编译失败。
public static void main(String[] args) {
int a;
System.out.println(a);//java: 可能尚未初始化变量a
}
给a赋值就是给a初始化
public static void main(String[] args) {
int a = 10;
System.out.println(a);//10
}
如果是对象,我们先定义一个狗类
public class Dog {
//成员属性
public String name;//姓名
public int age;//年龄
//成员方法
public void bark() {
System.out.println("汪汪!");
}
}
实例化一个对象并不给他初始化
public static void main(String[] args) {
Dog dog1 = new Dog();
System.out.println(dog1);//Dog@1b6d3586
System.out.println(dog1.name);//null
System.out.println(dog1.age);//0
}
我们没有给字段初始化,编译也能通过并且正常输出,这是为什么呢?
构造方法
构造方法是非常特殊的一个方法。作用:对对象中的成员进行初始化,不负责给对象开辟空间 。完成一个对象的构造分两步 1.分配内存 2.调用合适的构造方法。在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。当调用完成构造方法之后,对象才产生了
【注意】1.方法名必须和类名相同 2.没有返回值类型 设置成void也不行。构造方法之间是可以构成方法的重载的即方法名相同,参数列表不同。如下例:
//构造方法
public Dog() {
System.out.println("这是没有参数的构造方法");
}
public Dog(String name,int age) {
this.name = name;
this.age = age;
System.out.println("这是带有两个参数的构造方法");
}
如果你觉得麻烦,可以鼠标右键-->Generate-->Constructor-->你想要创建带几个参数的构造方法都可以,如果是没有参数的构造方法,需要你自己敲。
有了这两个构造方法之后,我们再运行以下代码,会发现,输出结果发生了变化:
如果用户没有定义构造方法,编译器会生成一份默认的构造方法,生成的默认构造方法一定是不带参数的。这也是上述我们不给字段初始化程序却能正常运行的原因。
但是当我们把不带参数的构造方法删除,只留一个带两个参数的构造函数时,运行代码就会报错
这是因为,一旦用户定义构造方法,编译器则不再生成不带参数的构造方法了。
this引用的作用--2
还记得this引用的第一个作用吗?不记得的话记得回去复习一下哦。(提示:在上面的代码中,有用到this的第一个用法哦。)
第二个作用:可以通过this调用其他构造方法来简化代码。【注】只能在构造方法内部使用,且只能在第一行 不能形成环 this();
public Dog() {
this("旺财",2);
System.out.println("这是不带参数的构造方法");
}
this(); 你只需要在括号里输入数据,系统会自动匹配对应的构造方法。
运行结果:
【注】不能形成环!!
public Dog() {
this("旺财",2);
System.out.println("这是不带参数的构造方法");
}
public Dog(String name,int age) {
this();
this.name = name;
this.age = age;
System.out.println("这是带有两个参数的构造方法");
}
编译不通过。
This引用作用--3
在成员方法中调用其他方法 this.方法名
public void bark() {
System.out.println(this.name+"汪汪!");
}
public void eat() {
this.bark();
System.out.println(this.name+"正在吃饭!");
}
public static void main(String[] args) {
Dog dog1 = new Dog("旺财",2);
dog1.eat();
}
输出结果:
调用语句的在方法中的位置没有要求,位置不同只影响输出顺序。
默认初始化
上面我们说过,用户没有定义构造方法,编译器会生成一份默认的构造方法,生成的默认构造方法一定是不带参数的。这也是上述我们不给字段初始化程序却能正常运行的原因。这个默认的构造方法会给创建的对象赋默认值。
数据类型 | 默认值 |
byte | 0 |
int | 0 |
short | 0 |
long | 0L |
fioat | 0.0f |
double | 0.0 |
char | '\u0000' |
boolean | false |
引用型 | null |
就地初始化
在生命成员变量时,直接赋值。
public class Dog {
//成员属性
public String name = "团圆";//姓名
public int age = 3;//年龄
…………
但我们不建议这样初始化。