2015-11-10 217 views
1
public class Test { 
    public static void main(String[] args){ 
     B b=new B(); 
     A a1=new A(); 
     A a2=b;    
     a1=b; 
     a1.printDescription(); //which prints I'm B 
     a2.printDescription(); //which also prints I'm B 
    } 
} 
class A{ 
    public void printDescription(){ 
     System.out.println("I'm A"); 
    } 
} 

class B extends A{ 
    public void printDescription(){ 
     System.out.println("I'm B"); 
    } 
} 

搜索後,我找到一個解釋Confusion in Java polymorphism,其中說:「即使X爲A型明確宣佈,它被實例化作爲B類的一個對象,所以我將運行版本在B類中定義的doIt()方法。「但是在我使用類A構造函數實例化對象之後,它仍然打印出」我是B「,那麼任何人都可以爲我解釋這一點嗎?對象類型混淆

+0

賦值'A1 = B'破陣您自己創建的新A將被覆蓋。 – laune

+0

什麼是您不清楚的?由於'a1 = b;'和'a2 = b','a1'和'a2'都包含'B'的實例(實際上甚至是相同的實例),並且由於多態性(或者更精確的後期綁定 - 也稱爲動態綁定)方法'printDescription'的代碼在運行時決定,並且基於實例的實際類型(而不是引用)。 – Pshemo

回答

5
B b=new B(); // b refers to an object of class B 
    A a1=new A(); // a1 refers to an object of class A 
    A a2=b; // a2 refers to an object of class B    
    a1=b; // now a1 refers to an object of class B 

兩個a1a2被分配參考b,這是指B類的對象。因此B的執行printDescription被執行,並且你得到了兩個「我是B」的輸出。

1
a1=b; 

bB,並且將其分配給a1。它並不重要在編譯時所說的類型。重要的是它在運行時的實際狀態。由於您指定了a1 a B,因此它是B

通過逐行狀況:

B b=new B(); //b is a B 
A a1=new A(); //a1 is an A, b is a B 
A a2=b;  //a1 is an A, b is a B, and a2 is the same B as b 
a1=b;   //a1, a2 and b are all references to the same B value 
0

正是因爲late binding。這裏覆蓋了方法(派生類實現了一個與base相同名稱的方法)。這將導致在變量引用而不是引用類型中保存的派生類型方法將被調用,並且這將在運行時確定。

例如:

//This is an A-type reference, referencing to a A-type object 
A a = new A(); 
B b = new B(); 

//The A-type reference, is now referencing to the B-type object. 
//The old, A-type object held will be set for garbage collection. 
A a = b; 

//This will call the mostly derived type referenced method (which is B), 
//which prints "I'm B" 
a.printDescription(); 
0

在代碼A1,A2和b是它們指向B. 的實例你開始創建A的一個對象作爲

A a1 = new A(); 
您的全球化志願服務青年可變

但後來你ASIGN爲 「b」 爲

a1 = b 

這就是爲什麼它是execu從B類的Ting方法不屬於A類

0

該圖解釋了發生了什麼。上半部分顯示你的代碼,下半部分試圖在內存中顯示它。

你的前三個人喜歡設置三個參考變量[b,a1和a2]。他們還設置了兩個對象[new B()和new A()]。它將b指向新的B()對象,它將a1指向新的A()對象,然後它將a2指向b指向的對象。

然後,訂單 「A1 = b」 的點的A1參考變量中的對象用b指向(這是相同的B()對象。

enter image description here