[英]Overloading of methods when extending classes in Java
如果我有這個代碼:
interface Tre{
public void f();
}
public class TreA implements Tre{
int x = 1;
public void f(){
x++;
System.out.println("Y"+x);
}
public static void main(String[] a){
Tre a3 = new TreB(); a3.f();
}
}
class TreB extends TreA{
public void f(){
x--;
super.f();
System.out.println("X"+x);}
}
我不明白為什么輸出是Y1 X1
。 如果我擴展了TreA
類,我將覆蓋它的f()
方法並獲得int x=1
的副本。 調用super.f()
應該調用屬於TreA
類的f()
但是x
呢? 我從未實例化過TreA
。 為什么它使用屬於TreB
的x
? 在這種情況下,范圍怎么樣?
當您實例化TreB時,會構建TreA(更具體地說,這是TreB)。 TreB沒有字段x將字段隱藏在TreA中,因此該對象只有一個字段x,在TreA中定義。 您可以從TreB訪問此內容,因為您沒有將其聲明為私有。
這是不好的做法btw,非final字段應該始終是私有的,以避免這樣的問題。 使用getter從TreA獲取值以用於TreB。
無論何時從任何地方調用該類,變量都會自我實例化。 調用默認構造函數並設置變量的值。
你可以看到這個例子。 調用該類時設置變量值。
public class TreA {
int x = 1;
public static void main(String[] a){
TreA b = new TreA();
System.out.println(b.x);
}
}
輸出為1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.