考考你對java多態的理解

請看以下代碼, 若是你能不運行得出正確答案, 那你真的超過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

相關文章
相關標籤/搜索