簡體   English   中英

在Java中擴展類時重載方法

[英]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 為什么它使用屬於TreBx 在這種情況下,范圍怎么樣?

擴展類意味着您的子類包含來自父類的所有內容。

我將覆蓋它的f()方法並獲得int x = 1的副本

你沒有得到一份副本,你只是擁有它(你繼承了它)並且可以使用它。

無論你在哪里使用x ,它總是從TreA繼承的相同變量,所以當TreA.f()修改它時,它正在修改你擁有的唯一x實例。

我從未實例化過TreA

創建子類意味着您也在創建父類。 在創建子類時,會自動調用其構造函數。

您必須認為TreB固有地包含 TreA ,然后您可以添加內容並進行覆蓋。

為了更好地可視化情況,這是你的A類:

父母班

這是它的子類B:

兒童班

正如您所看到的,B中的x變量 A類中的變量,而不是副本。

當您實例化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.

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