簡體   English   中英

Java繼承奇怪的行為

[英]Java Inheritance strange behaviour

以下代碼將輸出打印為40而不是30.我無法找出解決方案。 請幫助代碼。

class Base {

  int value = 0;

    Base() {
      addValue();
    }

    void addValue() {
      value += 10;
    }

    int getValue() {
      return value;
    }
}

class Derived extends Base {

  Derived() {
    addValue();
  }

  void addValue() {
    value +=  20;
  }
}

public class Test{

  public static void main(String[] args) {
    Base b = new Derived();
    System.out.println(b.getValue());
  }
}

Derived構造函數中的隱式超級引用調用Base構造函數,它反過來調用類Base中的方法addValue()導致value變量為10,然后Derived類中的addValue()應該將20加到值10.因此最終輸出為30 。

但代碼打印40。

Derived類中重寫了addValue方法。 重寫方法時,即使在基類中調用時,調用此類實例上的方法也始終調用重寫版本。

Derived類中,方法void addValue()指向Derived中定義的方法,而不是Base定義的方法

最有可能在擴展Base類時

class Derived extends Base {

  Derived() {

    addValue();

  }

  void addValue() { //here

    value +=  20;

  }

}

您將方法名稱設置為Base Class相同,這將覆蓋默認值:

   void addValue() {
      value += 10;
    }

因此,輸出為40 - > 20 + 20

正如其他人在我之前addValueaddValueDerived被覆蓋,因為它是一個具有相同名稱和相同參數類型的可訪問方法。 通常,您會將@Override注釋添加到覆蓋方法。 即使基類仍在構建中,派生類中的方法。

並非所有語言都做同樣的事情。 例如,C ++不會在派生類中運行重寫方法,而基本構造函數仍在運行。 C ++中的等效程序確實顯示30。

#include <iostream>

class Base {
public:
    int value;

    Base() : value(0) {
      addValue();
    }

    virtual void addValue() {
      value += 10;
    }

    int getValue() {
      return value;
    }
};

class Derived : public Base {
public:
  Derived() {
    addValue();
  }

  virtual void addValue() {
    value +=  20;
  }
};

int main() {
    Base *b = new Derived();
    std::cout << b->getValue() << std::endl;
}

addValue()Derived類中被覆蓋,您創建了一個Derived類對象。 所以每當addValue()被這個實例調用時。 始終將方法稱為Derived類。 這就是為什么Derived類的addValue()調用兩次。 一次在Base類構造函數中,第二個在Derived類構造函數中。

正如前面討論的其他方法一樣,Method Overriding屬性適用於基類中的方法調用。

通過這個java應用運行時多態性, 即,基於在運行時調用的對象,確定要執行的方法。 例如,

  • 如果使用超類對象來調用該方法,則將執行超類方法。
  • 如果使用子類對象來調用該方法,則將執行子類方法。

如果我們不想覆蓋,我們可以將父方法設為private而不是默認私有包 現在我們將獲得30作為輸出。 作為無法繼承的方法,它不能被覆蓋

class Base {

    int value = 0;

    Base() {
        addValue();
    }

    private void addValue() {
        value += 10;
    }

    int getValue() {
        return value;
    }
}

class Derived extends Base {

    Derived() {
        addValue();
    }

    void addValue() {
        value +=  20;
    }
}

public class Test{

    public static void main(String[] args) {
        Base b = new Derived();
        System.out.println(b.getValue());
    }
}

現在,輸出是30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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