//JAVA初始化分两大步 
//A、类的加载
//
//        先加载父类,在加载子类
//
//        加载父类后,完成静态动作【静态变量、静态代码块(主动执行仅一次)】(按代码顺序)、【静态方法(被动执行)】
//
//        加载子类后,完成静态动作【静态变量、静态代码块(主动执行仅一次)】(按代码顺序)、【静态方法(被动执行)】
//
//B、类的实例化
//
//        先实例化父类,在实例化子类
//        
//        实例化父类,完成实例化【成员变量、初始化块】(按代码顺序)、【父类构造方法】、【成员方法(被动执行)】
//    
//        实例化子类,完成实例化【成员变量、初始化块】(按代码顺序)、【子类构造方法】、【成员方法(被动执行)】


//注:类装载步骤(详解A步骤)
//     在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
//装载:查找和导入类或接口的二进制数据; 
//链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 
//校验:检查导入类或接口的二进制数据的正确性; 
//准备:给类的静态变量分配并初始化存储空间; 
//解析:将符号引用转成直接引用; 
//初始化:激活类的静态变量的初始化Java代码和静态Java代码块。 
//初始化类中属性是静态代码块的常用用途,但只能使用一次。


package cn.ilex;

public class InitClass2 extends Parent2 {



        // 初始化块        
        {        
                new PrintStr2("子类--初始化块");        
        }    
        
        // 静态变量        
  public static PrintStr2 a=new PrintStr2("子类--静态变量");
  
  // 变量        
  public PrintStr2 b=new PrintStr2("子类--实例变量");
  // 静态初始化块        
        static {        
            new PrintStr2("子类--静态初始化块(主动执行)");        
        }        
     
        // 构造器        
        public InitClass2() {        
            new PrintStr2("子类--构造器");     
                
        }        
     
        public void callParentStaticMethod(){

          Parent2.printString(this.getClass().getName()+"callParentStaticMethod()方法 ");
        }
        
        // 程序入口        
        public static void main(String[] args) {        
            Parent2.printString(" InitClass类 main() 方法");
            new PrintStr2("子类--进入程序入口 (静态方法) InitClass main()");
            new PrintStr2("子类--开始实例化 new InitClass()");
            new InitClass2().callParentStaticMethod();    
}

}
class Parent2 {        

        // 静态初始化块        
        static {        
            new PrintStr2("父类--静态初始化块(主动执行)");        
        }        

        public static String str="父类--静态方法被调用前加载完成的静态变量";
  
  // 静态变量        
        public static PrintStr2 c=new PrintStr2("父类--静态变量");

        // 变量        
     public PrintStr2 d=new PrintStr2("父类--实例变量");
        
        // 初始化块        
        {        
             new PrintStr2("父类--初始化块");        
        }        
     
        // 构造器        
        public Parent2() {        
            new PrintStr2("父类--构造器");        
        }        
        
        public static void printString(String s){

          new PrintStr2("父类--静态方法(被"+s+"调用执行)."    );
          new PrintStr2( "父类--静态方法调用自己的静态变量:str="+Parent2.str );
        }
        
        
}        



class PrintStr2{

  
  private static int i=0;
  static {

    Parent2.printString("PrintStr2 类静态块");
  }
  public    static    int getCount(){

    return i++;
  } 
  
  public PrintStr2(String s){


    System.out.println(PrintStr2.getCount()+"."+s);
         
  }
  public String toString(){

    
    return " PrintStr2 类型的";
  }
  
}