class ClassA {

    public ClassA() {
        System.out.println("ClassA() ctor");
     }
    public ClassA(String name) {
        System.out.println("ClassA(String name) ctor");
    }
    
}

class ClassB extends ClassA {    
    // no explicit constructors in ClassB
    // ClassA no-arg ctor will be implicitly called
    // but not so for other ctors
    
}

class ClassC extends ClassA {

    public ClassC(String name) {
        System.out.println("ClassB(String name) ctor");
    }


}

class ClassD extends ClassB {
    public ClassD() {
        System.out.println("ClassD() ctor");
    }   
}


class ClassE extends ClassA {
    public ClassE(){
        System.out.println("ClassE() ctor");
    }
}


class ClassF extends ClassE {

    public ClassF() {
        super();
        System.out.println("ClassF() ctor");
    }   
    
    public ClassF(String name) {
        System.out.println("ClassF(String name) ctor");
    }
    
}


class TestCtor {

    public static void main(String[] args) {
        System.out.println("New ClassB instance");
        ClassB b0 = new ClassB();        // implicit call to ClassA() ctor
                                                
//      ClassB b1 = new ClassB("Hello"); // ClassA ctor with String not called
                                         // implicitly; compile-error occurs
                                         
//      ClassC c0 = new ClassC();        // ClassA ctor not implicitly called
                                         // as a ctor exists, compiler does
                                         // not automatically create a no-arg
                                         // ctor in ClassC                                 
        
        System.out.println("\nNew ClassD instance");
                                                                                  
        ClassD d0 = new ClassD();        // explicit call to ClassA() ctor
                                         // followed by body of ClassD() ctor

        System.out.println("\nNew ClassE with no-args");
        ClassE e0 = new ClassE();

        System.out.println("\nNew ClassF instance with no-args");
        ClassF f0 = new ClassF();


        /* Note that even though ClassA has a ctor which takes
           a String parameter, only the ClassA no-arg ctor
           is implicitly called.
         */
        System.out.println("\nNew ClassF instance with parameter");
        ClassF f1 = new ClassF("Hello");
                                         
    }
}
