class App {
   public static void main(String[] args) {
///*
// Creation of instances of classes with no class members:
//    AD addfc = new AD();
//    AD ad = new AD(55);
//    BD bd = new BD(555);
//*/

// Creation of instance of class in a hierarchy with static members:
//    C rc = new C(); // static initialization of superclasses occurs
//
//    C.bla();

// However, initialization occurs "locally" when:
//    System.out.println("The A var is " + C.ad.getADdata());
//    System.out.println("The B var is " + C.bd.data);
//    C.bloo();

// Access can be done by reference variable:
//    C rc = null;
//
//    rc.bla();

// Compare, again, the above with:
//    System.out.println("A data is " + rc.ad.getADdata());
                                    // static variable method call
//    System.out.println("B data is " + rc.bd.data);
                                    // static variable field access
//    rc.bloo();
   }
}

class AD {

   int data;

   { System.out.println("The initial AD data is " + data); }

   { System.out.println("Now AD constructor, if any, " +
                        "will start executing!"); }

   AD() {}

   AD(int d) {
      data = d;
      System.out.println("The AD data is " + data);
   }

   int getADdata() { return data; }
}

class BD {

   int data;

   BD(int d) {
      data = d;
      System.out.println("The BD data is: " + data);
   }
}

class  A {
   static { System.out.println("Static block init " +
                               "of class A executing!"); }

   static AD ad = new AD(100);

   static { System.out.println("Second static block init " +
                               "of class A executing!"); }

   static void bloo() { System.out.println("Bloo of A called"); }
}

class B extends A {
   static { System.out.println("Static block init " +
                               "of class B executing!"); }

   static BD bd = new BD(1000);
}

class C extends B {
   static void bla() { System.out.println("C.bla called"); }
}
