[京北方筆試]java中的繼承與static

以下爲今天京北方的筆試題: java

-----------------------類A
public class A {
	static {
		System.out.println("A1");
	}
	public A(){
		System.out.println("A2");
	}
}

---------------類B-------------------
public class B extends A{
	static {
		System.out.println("b1");
	}
	public B(){
		System.out.println("b2");
	}
	public static void main(String[] args){
		A ab = new B();
		ab = new B();
	}
}
問輸出結果?當時一會兒給整蒙了,也怪我對static就沒怎麼在乎,因此再看到A ab用父類引用子類的代碼後就一直在這裏打轉了,就寫了個答案abab!哎~差得十萬八千里了。 被static修飾的方法或者變量屬於類,而不屬於對象。因此能夠用類名或者對象名引用這些方法或者變流量,當遇到沒有實例化的聲明時,這些方法仍然會被執行! 結果是
A1
b1
A2
b2
A2
b2


爲何呢?首先A ab  執行A中的靜態方法輸出A1,而後由於沒有構造A1的對象,因此不可能輸出A2;構造了B的對象因此輸出了b1  A2  b2,爲何呢?這裏可就有竅門了。構造B的對象時,先執行靜態代碼塊,靜態代碼塊屬於類,每一個對象均可以執行並且是在構造方法以前執行,輸出b1;接下來執行構造方法,B繼承了A,因此首先執行A的構造方法,輸出了A2,再執行本身的構造方法輸出了b2;最後的A2  b2,由於ab以前指向的是一個B對象的地址,而後再賦予一個B對象的地址,因此不會再執行以前A中的靜態方法,只會執行new B()應該輸出的結果。 spa

相關文章
相關標籤/搜索