阿里校招之类实例化的顺序

类A的定义

package com.sequence.test;

public class A {
	
//	静态变量
	static String name;
	
//	静态自由块
	static{
		name = "a";
		System.out.println("static filed of A inited.");
	}
//	实例变量
	String type;
//	非静态自由块
	{
		type = "a.type";
		System.out.println("no-static filed of A inited.");
	}
	String size;
//	构造函数
	public A(){
		size = "a.size";
		System.out.println("construct func of A inited.");
	}
}



类B的定义:
package com.sequence.test;

public class B extends A{
	
//	静态自由块
	static {
		System.out.println("static filed  of B inited.");
	}
//	非静态自由块
	{
		System.out.println("no-static filed of B inited.");
	}
	public B(){
		System.out.println("constuct func of B inited.");
	}
}



测试类InitSequenceTest:
package com.sequence.test;

public class InitSequenceTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new B();
	}

}



输出:

阿里校招之类实例化的顺序

总结如下:

1,静态自由块在class加载的时候执行。只会执行一次。

2,非静态自由块在新建类的实例的时候执行。可以多次执行。在新建其或子类的实例时,就会执行。

当存在多个同一种类型的自由块时,执行的顺序是根据他们在代码块中出现的顺序。

3,当子类继承父类,执行的顺序如下:父类的静态变量和静态域->子类的静态变量和静态域->父类的非静态自由块->父类的构造函数->子类的非静态自由块->子类的构造函数

你可能感兴趣的:(初始化,JavaSE,类初始化顺序,自由块)