Почему мои инициализаторы экземпляра 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
}