Consider the code below
class Meal {
Meal() { System.out.println(\"Meal()\"); }
}
class Bread {
Bread() { System.out.println(\"Bread()\"); }
These are instance fields
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
They only exist (execute) if an instance is created.
The first thing that runs in your program is
public static void main(String[] args) {
new Sandwich();
}
Super constructors are called implicitly as the first thing in each constructor, ie. before System.out.println
class Meal {
Meal() { System.out.println("Meal()"); }
}
class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}
class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()");}
}
After the super() calls, instance fields are instantiated again before the constructor code.
The order, reversed
new Sandwich(); // prints last
// the instance fields
super(); // new PortableLunch() prints third
super(); // new Lunch() prints second
super(); // new Meal(); prints first