展訊的一道筆試Java題(關於靜態初始化問題)

class Parent
{
	private String name=null;
	Parent(String name)
	{
	this.name=name;
	System.out.println("parent construct ");
	}
	static
	{
		System.out.println("parent static block ");
	}
	{
		System.out.println("parent block");
	}
	public static void method()
	{
		System.out.println("parent static method");

	}
	public void method1()
	{
	System.out.println("parent  method");
	}
}
class Son extends Parent
{
	private String name=null;
	Son(String name)
	{
		super(name);
		System.out.println("son construct ");
	}
	static
	{
		System.out.println("Son static block ");
	}
	public static void method()
	{
		System.out.println("son static method");

	}
	{
		System.out.println("Son block");
	}

}
class Daughter extends Parent
{
	private String name=null;
	Daughter(String name)
	{
		super(name);
		System.out.println("daughter construct ");
	}
	static
	{
		System.out.println("Daughter static block ");
	}
	public static void method()
	{
		System.out.println("daughter static method");

	}
	public  void method1()
	{
		System.out.println("daughter  method");

	}
	{
		System.out.println("Daughter block");
	}

}
class zhanxuntest
{
	
	public static void main(String[] args) 
	{
		
		Parent p1=new Son("childA");
		Parent p2=new Daughter("childB");
		p1.method();
		p1.method1();
		p2.method();
		p2.method1();
	}
}

打印結果爲

parent static block
Son static block
parent block
parent construct
Son block
son construct
Daughter static block
parent block
parent construct
Daughter block
daughter construct
parent static method
parent  method
parent static method
daughter  method

規律:父類靜態代碼塊先執行,然後執行子類靜態代碼塊,然後執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。注意父類中的靜態代碼塊只執行一次(凡是靜態的初始化如static int i=0都是隻執行一次),靜態方法不能被覆蓋,如Parent p=new Son("childA");  p.method(),調用的依舊是父類方法。注意不管是靜態方法還是非靜態方法,都需要調用後執行,其執行的次序和在類裏聲明的次序無關,區別是靜態方法是“class.method"方式執行,非靜態方法是"object.method"方式執行,即後者需要創建一個對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章