[英]Java subclass constructor inherited member
我有一個問題,為什么這段代碼在執行時為什么會打印出0值。我不完全了解SubClass構造函數中發生的情況,為什么在擦除覆蓋的方法hiddenValue時會打印出該值呢? out 10. SubClass構造函數是否使用SuperClass構造函數? 謝謝。
class SuperClass {
protected int superClassValue;
public SuperClass() {
superClassValue = implicitValue();
}
public int implicitValue() {
return 10;
}
public int getValue() {
return superClassValue;
}
}
class SubClass extends SuperClass {
private int subClassValue;
public SubClass() {
subClassValue = 20;
}
public int implicitValue() {
return subClassValue;
}
}
class Example {
public static void main(String argv[]) {
SubClass ss = new SubClass();
System.out.println("The value is " + ss.getValue());
}
}
TL; DR
問題是, implicitValue
從SubClass
所使用的超類隱式超類構造( super()
通過) implicitValue()
方法,前subClassValue = 20;
將在SubClass構造函數中執行,因此它返回subClassValue
默認值,其中int
字段為0
。
SubClass構造函數是否使用SuperClass構造函數?
是的,子類構造函數在開始時始終會調用超類構造函數,因此代碼
public SubClass() {
subClassValue = 20;
}
與...相同
public SubClass() {
super();//superclass constructor
subClassValue = 20;
}
但是,讓我們看看您的代碼。 您正在打印超類中存在的getVlaue()
方法的結果
public int getValue() {
return superClassValue;
}
如您所見,它返回superClassValue
值。 在調用getVlaue()
之前,您正在創建ss
實例,因此您正在調用代碼
super();//superclass constructor
subClassValue = 20;
這意味着您正在調用超類的構造函數,如下所示
public SuperClass() {
superClassValue = implicitValue();
}
所以this.superClassValue
被初始化的返回值implicitValue()
方法,但由於動態綁定 (后期綁定)JVM將嘗試尋找實現這種方法從實際的類的開始的this
是SubClass
,由於該類有其自己的覆蓋版本,它將被調用
public int implicitValue() {
return subClassValue;
}
但是subClassValue
尚未設置為任何值
super();// <-- we are still here
subClassValue = 20;// this line was not executed yet
因此subClassValue
仍具有其默認值0
,這意味着
superClassValue = implicitValue(); //will be initialized with 0;
所以
public int getValue() {
return superClassValue;
}
將返回0
。
是的,如果未明確給出此類調用,則子類構造函數將隱式調用超類構造函數。 但它打印0
,因為一個事實,即implicitValue
方法在重寫SubClass
。
SuperClass
部分。 所有變量均已初始化。 因為沒有給出顯式值,所以編譯器將superClassValue
的默認值設置為0
。 然后,超類構造函數將調用implicitValue()
,后者將調用子類的方法。 該方法返回已初始化為0
superClassValue
。 該值被明確分配回superClassValue
。 subClassValue
初始化為10
。 getValue()
方法,並返回superClassValue
,該值為0
。 The value is 0
。 如果要刪除implicitValue
的方法SubClass
,那么它會繼承SuperClass
的方法,該方法返回的版本10
。
如果要修改implicitValue
的方法SubClass
返回5
,那么它會初始化superClassValue
至5
,這將打印The value is 5
。
在您的情況下:默認情況下將調用SuperClass構造函數。
在Java進程中:new SubClass()。 它將首先調用SuperClass的構造函數。 調用SuperClass的構造方法時-將從hiddenValue()返回的值分配給superClassValue-調用的隱含值()方法是SubClass的方法(如您所想的那樣調用SupperClass的NOT hiddenValue()-OOP的多態性功能) 。 調用SubClass的implicitValue()時,subClassValue尚未初始化(subClassValue = 20;尚未運行),因此subClassValue仍為零。 這就是在輸出中看到零的原因。
當您刪除SubClass中的override hiddenValue時。 被調用的implicitValue()是SupperClass的implicitValue->這就是為什么您在輸出中看到10的原因。
聽起來您的Override方法或子類有問題。 因為這聽起來像是在實現變量時未實例化該值,所以它默認為0,然后在刪除它時,超類將接管,從而得到值10。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.