I guess it's pretty obvious when you make it explicit:
class A {
  A() {
    System.out.println("3");
  }
}
class B extends A {
  B(String foo) {
    super();
    System.out.println("2" + foo);
  }
}
class C extends B {
  C(String foo) {
    super(foo);
    System.out.println("1");
  }
}
When using these explicit constructor calls, you can see that super(...) is always the first instruction. Though this is what happens:
- new C("foo");will call the- Cconstructor
- first line in Cconstructor will call super constructor (B)
- Bconstructor is called
- first line in Bconstructor will call super constructor (A)
- Aconstructor is called (prints- 3)
- when all lines of Aconstructor are done, it will return control toBconstructor
- Bconstructor will execute all lines after the- supercall (prints- 2+- foo)
- then it will return control to Cconstructor
- Cconstructor will execute all lines after the- supercall (prints- 1)
When you don't create an explicit constructor this code will still be run in exactly the same order.
It's basically the same as calling methods from within methods, or calling super methods. The only difference is, that you must call the super constructor before you execute any other code.