jessen163 发表于 2013-2-3 11:27:21

JAVA 初始化顺序

//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 类型的";}}
页: [1]
查看完整版本: JAVA 初始化顺序