java类的初始化顺序

Posted 黄大仙爱编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java类的初始化顺序相关的知识,希望对你有一定的参考价值。

方便查看初始化顺序,使用了下面的打印类

public class Print {
	
	public Print(String str){
		System.out.println(str);
	}

}

本文讨论两种情况下类的初始化顺序,分别是单独类的初始化,和有继承关系的类的初始化

1.单独类的初始化

以下面的代码为例

public class Father {
	
	static {
		System.out.println("Father 静态代码块");
	}
	
	public static Print fatherStaticPrint = new Print("Father 静态变量");
	
	public Print fatherPrint = new Print("Father 非静态变量");
	
	public Father(){
		System.out.println("Father 构造函数");
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Father 析构函数");
	}
		
}

在main函数当中初始化

public static void main(String args[]){
		Father father = new Father();
		System.runFinalizersOnExit(true); 
}

执行的结果如下

image

 

如果将Father类的静态代码块和静态变量位置变换一下,如下所示

public class Father {
	
	public static Print fatherStaticPrint = new Print("Father 静态变量");
	
	static {
		System.out.println("Father 静态代码块");
	}
	
	public Print fatherPrint = new Print("Father 非静态变量");
	
	public Father(){
		System.out.println("Father 构造函数");
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Father 析构函数");
	}
		
}

那么执行的结果就变成

image

因此可以得出结论:静态代码块和静态变量的优先级是一样的,谁排在前面就先初始化谁。

具体过程如下图所示:

image

 

2.有继承关系的类的初始化

以下面的类为例

public class Son extends Father {
	
	static {
		System.out.println("Son 静态代码块");
	}
	
	public static Print SonStaticPrint = new Print("Son 静态变量");
	
	public Print SonPrint = new Print("Son 非静态变量");
	
	public Son(){
		System.out.println("Son 构造函数");
	}	
	
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Son 析构函数");
	}

}

类Son继承类Father,在Main函数当中初始化Son,执行结果如下

image

因此可以得出如下结论:

image

以上是关于java类的初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java类的初始化顺序

JAVA的初始化顺序:

java父子类的初始化顺序--个人总结

Java编程思想笔记-类的初始化顺序

java类的初始化顺序

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺