Почему мои инициализаторы экземпляра Java инициализируются дважды?

Я написал простой код с суперклассом и двумя подклассами для отслеживания порядка или инициализации. Мои статические инициализаторы ведут себя так, как ожидалось, и инициализируются в правильном порядке. Но инициализаторы моих экземпляров, кажется, запускаются дважды перед моими конструкторами. Я знаю, что это порядок инициализации, но я пытаюсь получить некоторое представление о том, чтобы следить за потоком, и не понимаю, почему инициализаторы экземпляра печатаются дважды. Вот мой код и результат, который я получаю. (см. ниже)

      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);

    }
}

Полученные результаты:

1 ответ

Наверное, потому что ваш 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
    }
Другие вопросы по тегам