为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
Date d = new Date(2021,6,9);
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
- 检测Dog的类是否加载JVM了,如果没有加载则加载
JVM运行起来会加载成千上万个类,也有很多类不是立即加载
程序中可能会自定义很多的类,这些类不是程序一开始就加载的,而是用谁加载谁 - 执行关键字new,看到new就在堆开辟空间。为对象在堆上开辟空间。到底开辟多大内存,就看着各类成员属性的类型以及个数来确定
- 调用构造方法 为每个成员属性赋初始值!
构造方法就是在产生对象时给对象赋值的!
类中变量都有默认值,默认值是其数据类型的默认值 - 处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
注意 构造方法就是为成员变量赋值的,因此构造方法也可以重载,重载只是参数的个数不同
为什么构造方法的重载与类型无关?
因为我们之前定义过了,我们只是决定不同的构造方法给那些属性赋值而已!
无参构造都是默认值,一个都不赋值
有参构造就根据参数的个数来决定赋值那几个成员变量
初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
数据类型------------------- 默认值
byte------------------------------ 0
char --------------------------‘\u0000’
short----------------------------- 0
int-------------------------------- 0
long----------------------------- 0L
boolean---------------------- false
float --------------------------0.0f
double -----------------------0.0
reference ----------------------null
就地初始化
在声明成员变量时,就直接给出了初始值。
public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){
}
public Date(int year, int month, int day) {
}
public static void main(String[] args) {
Date d1 = new Date(2021,6,9);
Date d2 = new Date();
}
}
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中