[英]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
正如其他人在我之前addValue
: addValue
在Derived
被覆蓋,因為它是一個具有相同名稱和相同參數類型的可訪問方法。 通常,您會將@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.