為什麼我的 Java Instance Initializers 初始化兩次?

小蜜蜂

我編寫了一個帶有超類和兩個子類的簡單代碼,以跟踪順序或初始化。我的靜態初始值設定項的行為符合預期並按正確順序進行初始化。但是我的實例初始化程序似乎在我的構造函數之前運行了兩次。我知道這是初始化的順序,但我試圖獲得一些洞察力並遵循流程並且不知道為什麼實例初始化程序打印兩次。這是我的代碼和我收到的輸出。(見下文)

class Bird{
    static {System.out.println("Static Initializer 1");}

    {System.out.println("Instance Initializer 1");}

    int feathers = 0;
    Bird(int x){ this.feathers = x; }
    Bird fly() { return new Bird(1); }
}


class Parrot extends Bird {

    static {System.out.println("Static Initializer 2");}

    {System.out.println("Instance Initializer 2");}

    protected Parrot(int y){ super(y); }
    protected Parrot fly(){ return new Parrot(2); }
}

public class Macaw extends Parrot {
    
    static {System.out.println("Static Initializer 3");}

    {System.out.println("Instance Initializer 3");}

    public Macaw(int z){ super(z); }
    public Macaw fly(){ return new Macaw(3); }

    public static void main(String... args){

        Bird p = new Macaw(4);
        System.out.println(((Parrot)p.fly()).feathers);

    }
}

結果:

結果

多米尼編碼器

可能是因為您的fly()方法實際上創建了一個新實例:

public Macaw(int z){ super(z); }
    public Macaw fly(){ return new Macaw(3); } <---- NEW

    public static void main(String... args){

        Bird p = new Macaw(4); // Instance 1
        System.out.println(((Parrot)p.fly()).feathers); // Calling fly() creates instance 2
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该担心C ++ 17中的Wmissing-field-initializers和聚合初始化吗?

我需要在测试之前在junit中运行一次初始化代码-Java

為什麼我的凱撒密碼 Java 程序返回空字符串?

為什麼 If elif 語句運行兩次?

為什麼我沒有在數組 JAVA 中獲得最小值?

為什麼這個 if 語句沒有初始化或更新我的變量?

為什麼我需要輸入兩次才能運行代碼

為什麼java編譯器不能識別for循環中變量的這個初始化?

為什麼我的字符串在初始化時會被連接起來?

這裡有什麼問題?(_instance' 尚未初始化)

為什麼我的 ArrayList 沒有打印出 Java 中所需的輸出?

為什麼我不能在同一行識別兩個變量

為什麼我的 TOAST 在後處理程序中顯示兩次?

為什麼我的 python 類被執行兩次?

為什麼我必須單擊我的按鈕兩次才能使其工作?

在 C 中,為什麼我有““s”:初始化需要一個大括號括起來的初始化列表”?

為什麼我的方法運行兩次並重置我試圖更改的對象值?

為什麼在什麼都不初始化時使用初始化列表?

為什麼我的代碼調用一個函數兩次?

為什麼組件只創建了兩次?

在java中,為什麼它很慢?

為什麼我的循環在 Angular/TypeScript 中循環兩次?

為什麼我的瀏覽器呈現兩倍的高度值?

為什麼我可以在 C++ 中傳遞對未初始化元素的引用?

為什麼我不能在 tuple() 中兩次使用相同的解析器?

為什麼我的兩個環境中 Mobx 6 的行為不同?

為什麼必須初始化 kotlin 類中的屬性另一方面 java 允許我這樣做

為什麼我需要在初始化時強制轉換 Rx 對象的值?

為什麼我會收到此錯誤?java.lang.ClasscastException