3、默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
package com.sh.work;
public class Date1 {
public int year;
public int month;
public int day;
public Date1(int year, int month, int day) {
// 成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
System.out.println(this.year);
System.out.println(this.month);
System.out.println(this.day);
}
public static void main(String[] args) {
// 此处a没有初始化,编译时报错:
// Error:(24, 28) java: 可能尚未初始化变量a
// int a;
// System.out.println(a);
Date1 d = new Date1(2021,6,9);
}
}
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
(1)检测对象对应的类是否加载了,如果没有加载则加载
(2)为对象分配内存空间
(3)处理并发安全问题比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
(4)初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
(5)设置对象头信息(关于对象内存模型后面会介绍)
(6)调用构造方法,给对象中各个成员赋值
4、就地初始化
在声明成员变量时,就直接给出了初始值
package com.sh.work;
public class Date2 {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date2(){
}
public Date2(int year, int month, int day) {
}
public static void main(String[] args) {
Date2 d1 = new Date2(2021,6,9);
Date2 d2 = new Date2();
}
}
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中