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]