簡體   English   中英

Java子類構造函數繼承的成員

[英]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

問題是, implicitValueSubClass所使用的超類隱式超類構造( 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將嘗試尋找實現這種方法從實際的類的開始的thisSubClass ,由於該類有其自己的覆蓋版本,它將被調用

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

  1. 超類構造函數被調用。 在這里,創建了對象的SuperClass部分。 所有變量均已初始化。 因為沒有給出顯式值,所以編譯器將superClassValue的默認值設置為0 然后,超類構造函數將調用implicitValue() ,后者將調用子類的方法。 該方法返回已初始化為0 superClassValue 該值被明確分配回superClassValue
  2. 子類將其subClassValue初始化為10
  3. 調用getValue()方法,並返回superClassValue ,該值為0 The value is 0

如果要刪除implicitValue的方法SubClass ,那么它會繼承SuperClass的方法,該方法返回的版本10

如果要修改implicitValue的方法SubClass返回5 ,那么它會初始化superClassValue5 ,這將打印The value is 5

  1. 在您的情況下:默認情況下將調用SuperClass構造函數。

  2. 在Java進程中:new SubClass()。 它將首先調用SuperClass的構造函數。 調用SuperClass的構造方法時-將從hiddenValue()返回的值分配給superClassValue-調用的隱含值()方法是SubClass的方法(如您所想的那樣調用SupperClass的NOT hiddenValue()-OOP的多態性功能) 。 調用SubClass的implicitValue()時,subClassValue尚未初始化(subClassValue = 20;尚未運行),因此subClassValue仍為零。 這就是在輸出中看到零的原因。

  3. 當您刪除SubClass中的override hiddenValue時。 被調用的implicitValue()是SupperClass的implicitValue->這就是為什么您在輸出中看到10的原因。

聽起來您的Override方法或子類有問題。 因為這聽起來像是在實現變量時未實例化該值,所以它默認為0,然后在刪除它時,超類將接管,從而得到值10。

暫無
暫無

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

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