2012-05-14 139 views
3

爲什麼TestClass.main()的輸出執行202 202 101?執行OOP繼承

class BaseClass 
{ 
    int data = 101; 
    public void print() 
    { 
     System.out.print(data + " "); 
    } 
    public void fun() 
    { 
     print(); 
    } 
} 
class SubClass extends BaseClass 
{ 
    int data = 202; 
    public void print() 
    { 
     System.out.print(data + " "); 
    } 
} 
class TestClass 
{ 
    public static void main(String[] args) 
    { 
     BaseClass obj = new SubClass(); 
     obj.print(); 
     obj.fun(); 
     System.out.print(obj.data); 
    } 
} 

隨着我那可憐的OOP知識,我想執行必須是這樣的:

1- obj.print();從子類打印202

2-因爲沒有obj.fun();方法在子類中調用父方法,所以輸出應該是101

3- System.out.print(obj.data);應該打印202,因爲該值在子類中被覆蓋。

所以我認爲輸出將是202 101 202但它不是,你能解釋我爲什麼嗎?

回答

4

由於沒有obj.fun();在子類方法中調用父類的方法,以便輸出應該是101

事實上,它要求fun超類,但是超類調用print,並作爲print被覆蓋,最重要的版本(在子類中)被調用。

System.out.print(obj.data);應該打印202,因爲該值在子類中被覆蓋。

變量不重寫,而是由子隱,與聲明爲BaseClassobj,它直接訪問它data財產。與方法調用不同,這是在編譯時決定的。

+0

現在我明白了,謝謝Binyamin。我會盡快給你答覆 –

2

因爲方法是多態和領域都沒有

如果刪除

int data = 101; 
BaseClass

它不會編譯

0

1和2 - 的方法是多態 - 從base class方法將使用方法從sub class如果它將能夠和OFC如果有參照sub class

3 - 字段心不是多態的。它來自於參考類型。

1

訣竅在於決定執行哪種方法。該選擇取決於對象實例的類型。在你的情況下,obj是​​,每次調用print()將執行​​的打印方法。這種機制被稱爲Polymorphism in OOP

而不是混合方法和變量,我建議你開始只做一些方法測試。代碼大部分是相同的,具有相同的多態行爲,但沒有變量。

class BaseClass 
{ 
    public void print() 
    { 
     System.out.print(101 + " "); 
    } 
    public void fun() 
    { 
     print(); 
    } 
} 
class SubClass extends BaseClass 
{ 
    public void print() 
    { 
     System.out.print(202 + " "); 
    } 
} 
class TestClass 
{ 
    public static void main(String[] args) 
    { 
     BaseClass obj = new SubClass(); 
     obj.print(); 
     obj.fun(); 
    } 
}