初始化顺序
package lcy; public class Test6 { /** * 方法描述:移动端— * 创建人:汪俊 * 创建时间:2017-8-1 上午09:01:37 * 修改人:汪俊 * 修改时间:2017-8-1 上午09:01:37 * 修改备注: * @version V1.0 */ //静态变量 static String i=lcy(); public static String lcy() { System.out.println("父类静态变量"); return "静态变量"; } //静态语句块 static { System.out.println("父类静态语句块1"); } //静态语句块 static { System.out.println("父类静态语句块2"); } //静态语句块 static{ System.out.println("父类静态语句块3"); } //非静态变量 String j=pplcy(); public String pplcy() { System.out.println("父类非静态变量"); return "父类非静态变量"; } //非静态语句块 { System.out.println("父类非静态语句块1"); } //非静态语句块 { System.out.println("父类非静态语句块2"); } //非静态方法 public void bDisplay(){ System.out.println("父类非静态方法"); return ; } //静态方法 public static void bTest(){ System.out.println("父类静态方法"); return ; } //构造函数 public Test6(){ System.out.println("父类构造函数"); } public static void main (String args[]) { Test6 a=new Test6(); a.bDisplay(); a.bTest(); } }
结论:在初始化类时候,首先加载类的静态变量和静态语句块(按照代码上下顺序执行),然后加载类的非静态变量和非静态语句块(按照代码上下顺序执行),最后加载类的构造函数。
至于类的静态方法和非静态方法只有主动调用的时候才会执行,区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。
以下是有子类的情况:
package lcy; public class Test7 extends Test6 { /** * 方法描述:移动端— * 创建人:汪俊 * 创建时间:2017-8-1 上午09:01:37 * 修改人:汪俊 * 修改时间:2017-8-1 上午09:01:37 * 修改备注: * @version V1.0 */ //静态变量 static String a=lcyhh(); public static String lcyhh() { System.out.println("子类静态变量"); return "静态变量"; } //静态语句块 static { System.out.println("子类静态语句块1"); } //静态语句块 static { System.out.println("子类静态语句块2"); } //静态语句块 static{ System.out.println("子类静态语句块3"); } //非静态变量 String b=ppplcy(); public String ppplcy() { System.out.println("子类非静态变量"); return "子类非静态变量"; } //非静态语句块 { System.out.println("子类非静态语句块1"); } //非静态语句块 { System.out.println("子类非静态语句块2"); } //非静态方法 public void bDisplay(){ System.out.println("子类非静态方法"); return ; } //静态方法 public static void bTest(){ System.out.println("子类静态方法"); return ; } //构造函数 public Test7(){ System.out.println("子类构造函数"); } }
运行结果分析②:
Test6 a=new Test6(); //在父类Test6中执行结果,和
运行结果分析①完全相同
Test6 a=new Test6(); //在子类Test7中执行结果如下
父类静态变量
父类静态语句块1
父类静态语句块2
父类静态语句块3
子类静态变量
子类静态语句块1
子类静态语句块2
子类静态语句块3
父类非静态变量
父类非静态语句块1
父类非静态语句块2
父类构造函数
结论:在初始化父类Test6的时候,首先加载父类的静态变量和静态语句块(按照代码上下顺序执行),然后加载子类的静态变量和静态语句块(按照代码上下顺序执行),然后加载父类的非静态变量和非静态语句块(按照代码上下顺序执行),最后加载父类的构造函数。
浙公网安备 33010602011771号