i think if you donot put the call to super() , the compiler will insrt it for you.check the s&b book that shows what happens for the different types of constructor.here the compiler will insert that super() call for you.since you did not pride for one. s&b page 318 table. please correct me if i am wrong.

It is not mandatory that you call super(). The compiler will do it for you. However if you do call super() or this(), then you need to call it on the first line. If you plan to use variables in the call then you can only use static ones.

It complied because you wrote explict constructor for MySub with no arguments and created object of the class by calling constructor with no arguments that in turn called super class constructor with one int argument, everything is fine so it compiled.

if it were MySuper sup=new MySuper(); then compile time error might have occured.

it is not necessary to call super(), if you dont write any constructor in subclass(same with any class) then compiler automatically inserts one default constructor and its first line would be super(),

but in your example there is no constructor in superclass with zero arguments(compiler will not depend on default implicit construtor if you wrote one explicit constructor),so it is necessary to define explicit constructor in sub class and write super(int) in it otherwise whom would super() call.

Hi! I deem you must read that book more than once! If you don't put super() or this() in a constructor, the compiler will put a call to super() as the first statement automatically.iif you don't put super(),you will get complie error!

To my knowledge if you don't have any constructor in Super(Parent) class then, the JVM will add a "Default Constructor" which is nothing but a empty constructor like the one given below MySuper(){} So even if you create any Constructor in child class it will not lead to compilation issue. But if you added an explicit constructor say MySuper() { System.out.println("MySuper"); } Then in the child class you need to add the super() explicitly or else it will leads to a Compilation issue. MySub() { super(); System.out.println("MySub"); } Hope you are clear now.

By the way the output for your code is

It will execute the Parent(Super) constructor first (Because the Object reference is of MySuper type) and then only the MySub(Child) will be executed.