Java 的初始化顺序

初始化顺序: 

    1.将对象内存空间初始化为二进制0(所有的数据成员被设为默认值)

    2.如果该类有基类则初始化其基类(调用默认基类构造器,也可在子类构造器中指定调用基类的某个构造器)

    3. 静态成员和静态域(谁在前谁先初始化,且在内存中只占一份空间,同一个类不同对象可以共享) 

    4.main方法 

    5.非静态成员变量,引用,实例初始化  被初始化

    6. 构造器

1,2,3,4为类加载过程,5,6为new对象过程,只有new会执行。

class A {
	A() {
		System.out.println("基类构造器");
		System.out.println("证明数据成员被设为默认值");
		draw();

	}

	A(String s) {
		System.out.println(s);
	}

	void draw() {
		System.out.println("A.draw()");
	}

}

public class Test extends A {

	int i = 5;

	Test() {
		System.out.println("子类构造器");
		System.out.println("证明数据成员在构造器调用之前被初始化");
		draw();
	}

	String b = "非静态成员";
	A a = new A(b + "与非静态引用");

	{
		A b = new A("实例初始化");
	}

	String c = "非静态成员与实例初始化平级,谁在前先初始化谁";
	A d = new A(c);

	void draw() {
		System.out.println("i = " + i);
	}

	static A start = new A("---类加载---");
	static String e = "静态成员";
	static A f = new A(e + "和静态引用");

	static {
		A g = new A("静态域");
	}

	static String h = "静态成员与静态域平级,谁在前先初始化谁";
	static A j = new A(h);

	public static void main(String[] args) {

		System.out.println("main执行");
		System.out.println("---创建Test对象---");
		Test k = new Test();

	}

}

输出结果:

---类加载---
静态成员和静态引用
静态域
静态成员与静态域平级,谁在前先初始化谁
main执行
---创建Test对象---
基类构造器
证明数据成员被设为默认值
i = 0
非静态成员与非静态引用
实例初始化
非静态成员与实例初始化平级,谁在前先初始化谁
子类构造器
证明数据成员在构造器调用之前被初始化
i = 5





猜你喜欢

转载自blog.csdn.net/strawmi/article/details/79631062