Рассмотрим приведенный ниже код
class Meal {
Meal() { System.out.println("Meal()"); }
}
class Bread {
Bread() { System.out.println("Bread()"); }
}
class Cheese {
Cheese() { System.out.println("Cheese()"); }
}
class Lettuce {
Lettuce() { System.out.println("Lettuce()"); }
}
class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}
class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()");}
}
class Sandwich extends PortableLunch {
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich() {
System.out.println("Sandwich()");
}
public static void main(String[] args) {
new Sandwich();
}
}
Основываясь на моем понимании инициализации члена класса и порядке выполнения конструктора. Я ожидал, что вывод будет
Bread()
Cheese()
Lettuce()
Meal()
Lunch()
PortableLunch()
Sandwich()
поскольку я считаю, что члены класса были инициализированы еще до вызова основного метода. Однако, когда я запускал программу
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()
моя путаница - это сыворотка() Lunch() и PortableLunch() перед Хлебом() Сыром() и Lettuce(), хотя их конструкторы, в которых вызывается.