簡體   English   中英

超級類和子類之間的數據所有權

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM