Java程序运行一旦创建了类,对象的存在就显得理所当然了,那么当我们在Java程序中创建一个新的对象的时候,计算机是如何给新对象初始化的呢?本片就详述Java中对象的初始化进程。
先读一串代码:
public class Test {
private String name;
{
System.out.println(this.name);
}
public Test(String name) {
this.name = name;
System.out.println(this.name);
}
public static void main(String[] args) {
new Test("Tom");
}
}
运行结果:
问题出来了,为什么第一个是null?不应该两个都是Tom吗?接下来我会解释
之前的博客说过,非静态代码块在创建新对象时执行,也就是说,当你声明创建一个新的对象的指令被读取到时,非静态代码块就运行了,因为name是一个全局变量,之前的博客也说过,全局变量有默认初始值,String类型默认为null。这就是为什么第一行的输出为null。这就是对象初始化的第一个步骤:1.–给对象的实例变量分配空间,默认初始化成员变量
那么问题来了,如果我在非静态代码块里给成员变量赋值呢?那么改写上方代码:
public class Test {
private String name = "Jim";
{
System.out.println(this.name);
}
public Test(String name) {
this.name = name;
System.out.println(this.name);
}
public static void main(String[] args) {
new Test("Tom");
}
}
声明成员变量时给name赋初值,再看运行结果:
第一行的输出变成了Jim,程序将声明的初始值初始值给了name,这就是Java中对象初始化过程的的第二步:2.成员变量声明时的初始化。
再改写代码:
public class Test {
private String name="Jim";
{
System.out.println("第二步"+":"+this.name);
this.name = "sam";
System.out.println("第三步"+":"+this.name);
}
public Test(String name) {
this.name = name;
System.out.println("第四步"+":"+this.name);
}
public static void main(String[] args) {
new Test("Tom");
}
}
结果如下图:
3.–初始化块初始化4.–参构造方法初始化
综上,可知Java对象的初始化过程分为上述四步:
–给对象的实例变量分配空间,默认初始化成员变量
–成员变量声明时的初始化
–初始化块初始化
–参构造方法初始化
以上,就是对Java对象初始化过程的详述。