2011-08-05 40 views
5

我有一個代碼:父成員函數隱藏孩子的數據成員

class Parent{ 
    int x=10; 
    void show(){ 
     System.out.println(x); 
    } 
} 

class Child extends Parent{ 
    int x=20; 
    public static void main(String[] args){ 
     Child c=new Child(); 
     c.show(); 
    } 
} 

在這裏,當我運行這個程序的輸出來爲10.在運行時父成員函數這意味着不使用兒童數據成員具有相同的名稱(數據隱藏)。我知道的是,無論何時我們擴展一個類的父類成員函數和數據成員都可用於Child類,那麼當我說c.show()爲什麼它需要父類的數據成員不是Child類。另外,我想知道當我們創建一個Child類的對象時,它的Parent類的數據成員被放入Heap中Child類對象的Parent部分,但是成員函數會發生什麼?

回答

4

孩子不能通過簡單地聲明自己的字段版本來隱藏父類中方法的字段。您正在應用「數據隱藏」的想法。孩子永遠不能隱藏來自父母的字段,但父母可以隱藏孩子的字段(通過聲明xprivate)。如果你願意,你可以use encapsulation to achieve your desired effect,如:

class Parent{ 
    private int x=10; 

    public int getX() { 
     return x; 
    } 

    void show(){ 
     System.out.println(this.getX()); 
    } 
} 

class Child extends Parent{ 
    int x=20; 

    @Override 
    public int getX() { 
     return x; 
    } 

    public static void main(String[] args){ 
     Child c=new Child(); 
     c.show(); 
    } 
} 

通過重寫getX()訪問方法,孩子可以從世界其他地方隱藏的x父母的價值。

的其他一些觀點值得商榷:

我所知道的事情是,當我們擴展一個類其父 類的成員函數和數據成員可用於兒童類

這不完全正確。私有方法和數據成員不會(直接)可用於子類。只有公共,受保護和「包級」的方法和字段才能直接訪問子類。

另外,我想知道,當我們創建子類的對象及其 父類的數據成員被放在兒童類 對象在堆父節,但會發生什麼成員函數?

成員函數不屬於每個實例創建。如果JVM像那樣工作,那將會非常低效。相反,給定類的方法實現只定義一次,作爲Permanent Generation的一部分,該類包含類定義和其他內部JVM狀態。給定類的所有實例都將共享相同的方法定義。

對於子類的情況,它將共享其父代的方法定義,並且它也會爲其子類中存在的任何方法(以及它覆蓋的任何方法)添加自己的定義。

+1

+1有趣的點。 – Mahesh

5

我所知道的事情是,當我們擴展一個類的父類的成員函數和數據成員可用於兒童類,那麼,當我說c.show()爲什麼需要數據成員Parent類不是Child類。

你的理解正確。但其他情況並非如此。父類子對象不能訪問子類子對象。由於show()位於基類Parent的範圍內,因此它正在訪問它自己的成員。嘗試在父類中評論成員x並查看您的程序是否編譯。

Commented x in parent class and see the output yourself

+0

當我在父母註釋成員'x'它不會編譯和顯示'System.out.println(x)'錯誤。好的,我可以理解,但我不清楚它的功能範圍與此有關嗎? –

+1

父類成員函數只能訪問其成員。當你調用'c.show();'時,你現在處於'Parent'類的範圍內。如果成員函數在'Child'類中被覆蓋,那麼範圍將在'Child'類中。 **當你試圖訪問一個實例變量/方法時,它應該在它所在的位置範圍內。** – Mahesh

+0

好的,但是我的第二個問題仍然沒有答案。當我們創建Child類的對象,然後在堆中創建一個具有Child類的數據成員並且在Child類對象內部的Child類對象時,還有另一個父類數據成員。那麼show()如何對應於Parent的數據成員? –

1

X在孩子僅在陰影的基類,而不是覆蓋它。基類成員變量不會被更改,只能由具有相同名稱的子類中的單獨變量隱藏。它們仍然是完全不同的變量。