[英]Data Ownership between super class and sub class
當子類繼承父類時,子類與在父類中定義的具有不同可訪問性的字段之間的關系是什么,該字段歸子類所有,哪些不是。 有人可以解釋以下示例:
class Parent
{
private int partOne = 0;
public int partTwo = 1;
public void tellMe()
{
System.out.println(partOne);
System.out.println(partTwo);
}
}
class Child extends Parent
{
private int partOne = 2;
public int partTwo = 3;
public void main(String[] args)
{
Child child = new Child();
child.tellMe();
}
}
in the stack , I found the Child instance has four fields , two defined by its class and two by its parent class , I was very confused.Did I create a parent instance when I create a child instance , IMP , I think it only enter the parent class's constructor, but I can't explain why the child class don't override the two fields , or at least , I think it should override the with the accessibility .Please tell me what is the reason, thanks. 當我在Eclipse中調試它時,我看着堆棧中的變量 ,我發現Child實例有四個字段,兩個字段由其類定義,兩個字段由其父類定義,我感到非常困惑。我創建父實例時,創建一個子實例IMP,我認為它只能輸入父類的構造函數,但我無法解釋為什么子類不覆蓋這兩個字段,或者至少,我認為它應該使用可訪問性來覆蓋 。請告訴我原因是什么,謝謝。
為什么子類不覆蓋這兩個字段,或者至少,我認為它應該覆蓋具有公共可訪問性的partTwo
在Java中,數據成員不是多態的。 這意味着在您的示例中, Child
類中定義的兩個字段與Parent
類中的兩個字段完全無關,即使它們碰巧共享了它們的名稱。
盡管語言允許這樣做,但做這種性質的事情只是造成混亂的秘訣(如您所知)。
如果您想要多態行為,請創建兩個成員函數 getPartOne()
和getPartTwo()
,並在適當時覆蓋它們。
發生的情況是,您通過在Child
類上使用相同的名稱重新定義了對Parent
類的partTwo
字段的訪問權限。 實際上,您應該從編譯器收到有關此的警告。
做以下實驗,看看發生了什么:
Child
的構造函數上調用super
(是的,這不是必需的,但這可以使事情變得更清楚)。 Child
類中刪除partTwo
變量-它仍將編譯,但這次將應用Child
的構造函數設置的值(警告將消失)。 您可能已經看到了我發表的關於封裝的評論-僅使用私有字段可以防止此類混淆,並在以后更好地維護您的類,因為您可以更改類的字段而不會影響繼承類(只要訪問方法數據保持不變)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.