1. 程式人生 > >Java 子類繼承父類成員中的問題

Java 子類繼承父類成員中的問題

subclass 情況 討論 就會 之前 測試 public 測試結果 string

  之前搞錯了,變量沒有“重寫”一說,只有方法才能被“重寫”。如果我們在子類中聲明了一個和父類中一樣的變量,那麽實際的情況是,子類的內存堆中會有類型和名字都相同的兩個變量。

  現在考慮一種情況,如下所示,我們在子類中聲明一個名字與父類中變量一樣,但是類型不同的變量i(一個int,一個double),同時我們在父類中有一個print()打印i,那麽當我們從子類的對象中調用這個print()時,他到底會打印哪一個i?

class SuperClass {
    public  int i;
    SuperClass(){
        i=10;
        System.out.println(
"SuperClass() is construted."); } public void print(){ System.out.println("the i in SuperClass: "+i); } } class SubClass extends SuperClass { public double i; SubClass(){ i=20.0; System.out.println("SubClass() is constructed."); } public void printSub(){ System.out.println(
"the i in SubClass: "+i); } } public class TestDemo { public static void main(String[] args) { SubClass sub=new SubClass(); System.out.println("sub.i is: "+sub.i); sub.printSub(); sub.print(); } } 輸出結果為: SuperClass() is construted. SubClass() is constructed. sub.i is:
20.0 the i in SubClass: 20.0 the i in SuperClass: 10

  我們很清楚,如果在子類中重新聲明一個同樣的print()函數,父類的print()函數就會被覆蓋掉,這時print()輸出的是在子類中定義的double i=20.0,所以對這種情況我沒有討論。

  從輸出結果來看,通過子類SubClass的對象sub訪問到的i的值為double i=20.0,然而通過子類對象調用在父類中定義的print(),打印的仍然是父類中的int i=10,如何解釋這種情況?

  現在我們把SubClass進行修改:

class SubClass extends SuperClass {
    public int i;
    SubClass(){
        i=20;
        System.out.println("SubClass() is constructed.");
    }
    public void printSub(){
        System.out.println("the i in SubClass: "+i);
    }
}

/*測試結果為*/
SuperClass() is construted.
SubClass() is constructed.
sub.i is: 20
the i in SubClass: 20
the i in SuperClass: 10

  我們看到,就算是在子類SubClass中聲明了一個完全一樣的i,通過子類對象調用在父類中定義的print(),打印的仍然是父類中的int i=10。

Java 子類繼承父類成員中的問題