請看以下代碼, 若是你能不運行得出正確答案, 那你真的超過99%的java程序員了. [本人屬於最大頭的那部分]java
public class A{ public String s = "A"; public void setS(String s){ this.s = s; } public String getS(){ return this.s; } } public class B extends A{ public String s = "B"; public void setS(String s){ this.s = s; } public String getS(){ return this.s; } public static void main(String[] args){ A a = new A(); B b = new B(); a.setS("[AA]"); b.setS("[BB]"); a = b; System.out.print(a.s); System.out.print(b.s); System.out.print(a.getS()); System.out.print(b.getS()); } }
輸出的結果是多少呢? [AA][BB][AA][BB]或者[AA][BB][BB][BB],這兩個答案你會選擇其中哪一個? 其實這兩個答案都是錯誤的, 正確是: A[BB][AA][BB]. 這裏考察的一個知識點是子類的引用指向了父類類型, 看你是否深刻理解過.程序員
在java的繼承裏屬性是不支持多態的,只有方法支持多態. 可能你會想方法不支持多態那麼a.s那麼會輸出"[AA]"纔對啊.其實當執行了a = b; 這條賦值語句後, a對象與他原來new出來的對象沒有任何關係了.jvm
b對象在構造出來以前,jvm會先初始並生成一個b對象的父類實例也就是A類的對象,那麼A對象的屬性 s 固然就被默認初始化爲"A"了. 執行a = b這條語句, a對象實際上是指向了b對象的隱藏父類對象(就是b對象生成以前構造出的父類對象),咱們就能理解爲何輸出這個結果了. 那麼方法調用輸出的結果,天然是體現了java中的多態了後面三個結果都是"[BB]".學習
[因爲我的能力有限, 寫的不許確的地方歡迎你們多多指正, 共同窗習!]this
參考:http://blog.csdn.net/zdwzzu2006/article/details/5979886.net