初始化创造的原始世界——java类的初始化顺序

java类的初始化顺序

java类的初始化顺序常会出现在java的笔试和面试题中,本文将通过实践代码对java类的初始化顺序做个分析!

首先结论话语放前面,java类的初始化顺序依次如下:

1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3. 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行,且每创建一个对象就执行一次。
4.执行父类的构造方法。
5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行,且每创建一个对象就执行一次。
6.执行子类的构造方法。

演示实例1:

 

public class ClassInitOrder {

	public static void main(String[] args) {
		Child c1 = new Child();
		
	}
}

class Father{
	
	static {
		System.out.println("Father的static块……");
	}
	//初始化块

	{
		System.out.println("Father的初始化块……");
	}
	//构造方法
	public Father(){
		System.out.println("Father的构造方法被调用……");
	}
}

class Child extends Father{
	
	static {
		System.out.println("Child的static块……");
	}
	
        //初始化块
	{
		System.out.println("Child的初始化块……");
	}
	
        //构造方法
	public Child(){
		System.out.println("Child的构造方法被调用……");
	}
}

 

程序结果:

初始化创造的原始世界——java类的初始化顺序_第1张图片

从结果可以看出,类在初始化的时候,顺序是:

静态成员-->初始化块-->构造方法,然后按照这个顺序,父类与子类依次执行,即先父类的静态成员,再子类静态成员,接着父类初始化块,再子类初始化块,依此类推……

 

演示实例2:

 

public class ClassInitOrder {

	public static void main(String[] args) {
		Child c1 = new Child();
		Child c2 = new Child();
	}
}


class Child{
	
	static {
		System.out.println("Child的static块……");
	}
	
	{
		System.out.println("Child的初始化块……");
	}
	
	public Child(){
		System.out.println("Child的构造方法被调用……");
	}
}

 

程序结果:

初始化创造的原始世界——java类的初始化顺序_第2张图片

从结果可以看出,static块在在整个程序运行过程中,只执行一次,即static块是针对类的,不是针对对象的,static块或者说static的成员,在程序运行时第一次被访问的时候(该类的第一个对象被创建时)只初始化一次,之后不再执行;而初始化块是针对对象的,每创建一个对象,就执行一次。

 

演示实例3:

 

public class ClassInitOrder {

	public static void main(String[] args) {
		Child c1 = new Child();
		
	}
}

class Child{
	static int a, b = 3;
	
	static {
		a++;
		System.out.println("a = " + a);
	}
	
	static {
		a = b;
		System.out.println("a = " + a);
	}
	
}


结果:

 

初始化创造的原始世界——java类的初始化顺序_第3张图片

把两个static块位置换一下

 

public class ClassInitOrder {

	public static void main(String[] args) {
		Child c1 = new Child();
		
	}
}

class Child{
	static int a, b = 3;
	
	static {
		a = b;
		System.out.println("a = " + a);
	}
	
	static {
		a++;
		System.out.println("a = " + a);
	}
	
}


结果:

 

初始化创造的原始世界——java类的初始化顺序_第4张图片

从结果可以看出,当类中存在多个static块或者static成员时,按照他们在程序中出现的顺序依次执行!

 

希望对读者有帮助,转载请注明出处!

你可能感兴趣的:(Java开发,java)