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");
	}
}

运行结果:

java 初始化 接口 java对象初始化过程_Test

问题出来了,为什么第一个是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赋初值,再看运行结果:

java 初始化 接口 java对象初始化过程_Test_02


      第一行的输出变成了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");
	}
}

 结果如下图:

java 初始化 接口 java对象初始化过程_Java_03

3.–初始化块初始化4.–参构造方法初始化

综上,可知Java对象的初始化过程分为上述四步:

–给对象的实例变量分配空间,默认初始化成员变量

–成员变量声明时的初始化

–初始化块初始化

–参构造方法初始化

以上,就是对Java对象初始化过程的详述。