java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java类初始化顺序

Java类的初始化顺序的实现

作者:无问287

类的初始化过程是在类加载阶段完成的,包括加载、验证、准备、解析和初始化等步骤,本文主要介绍了Java类的初始化顺序的实现,感兴趣的可以了解一下

类初始化顺序遵循以下三个原则(优先级依次递减)

1、静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;

2、父类优先于子类初始化;

3、成员变量按照定义先后顺序进行初始化;

例如:静态变量、非静态变量、静态代码块、非静态代码块、构造函数、父类、子类等。

他们的初始化顺序是:父类静态变量 > 父类静态代码块 > 子类静态变量 > 子类静态代码块 > 父类非静态变量 > 父类非静态代码块 > 父类构造函数 > 子类非静态变量 > 子类非静态代码块 > 子类构造函数。 

1.对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序是?

public class Test1 {
	// 静态变量
	public static String staticField = "静态变量";
	// 变量
	public String field = "变量";
	// 静态初始化块
	static {
	  System.out.println(staticField);
	  System.out.println("静态初始化块");
	}
	// 初始化块
	{
	  System.out.println(field);
	  System.out.println("初始化块");
	}
	// 构造器
	public Test1() {
	 System.out.println("构造器");
	}
	public static void main(String[] args) {
	 new Test1();
	}
}

执行结果如下:

2.在继承场景下,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺是?

class Parent { 
	 // 静态变量
	 public static String p_StaticField = "父类--静态变量";
	 // 变量
	 public String p_Field = "父类--变量";
	 // 静态初始化块
	 static {
	   System.out.println(p_StaticField);
	   System.out.println("父类--静态初始化块");
	 }
	 // 初始化块
	 {
	   System.out.println(p_Field);
	   System.out.println("父类--初始化块");
	 }
	 // 构造器
	 public Parent() {
	   System.out.println("父类--构造器");
	 }
}
public class Test2 extends Parent {
	 // 静态变量
	 public static String s_StaticField = "子类--静态变量";
	 // 变量
	 public String s_Field = "子类--变量";
	 // 静态初始化块
	 static {
	   System.out.println(s_StaticField);
	   System.out.println("子类--静态初始化块");
	 }
	 // 初始化块
	 {
	   System.out.println(s_Field);
	   System.out.println("子类--初始化块");
	 }
	 // 构造器
	 public Test2() {
	   System.out.println("子类--构造器");
	 }
	 // 程序入口
	 public static void main(String[] args) {
	   new Test2();
	 }
}

 执行结果如下:

3.静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢? 

public class Test3 {
// 静态变量
public static TestA a = new TestA();
// 静态初始化块
static {
   System.out.println("静态初始化块");
}
// 静态变量
public static TestB b = new TestB();
	public static void main(String[] args) {
		new Test3();
	}
}
class TestA {
	public TestA() {
		System.out.println("Test--A");
	}
}
class TestB {
	public TestB() {
		System.out.println("Test--B");
	}
}

执行结果如下:

到此这篇关于Java类的初始化顺序的实现的文章就介绍到这了,更多相关Java类初始化顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文