java初始化顺序
1 package com.zhangcy.test.init; 2 3 public class Base { 4 5 int str; 6 static int val1=1; 7 final int val2=2; 8 static final int val3 = 3; 9 10 public Base(final int s){ 11 printStr(); 12 System.out.println("pre-base:"+str); 13 str = s; 14 this.printStr(); 15 System.out.println("aft-base:"+str); 16 } 17 18 public Base(){ 19 printStr(); 20 } 21 22 private void printStr(){ 23 System.out.println("base:"+str); 24 System.out.println("base-val1:"+val1); 25 System.out.println("base-val2:"+val2); 26 System.out.println("base-val3:"+val3); 27 } 28 29 }
package com.zhangcy.test.init; public class Derived extends Base { int str; static int val1=4; final int val2=5; static final int val3=6; //Base base = new Base(str); //static Base base2 = new Base(); public Derived(int s) { super(); System.out.println("pre-derived:"+str); str = s; System.out.println("aft-derived:"+str); printStr(); } public void printStr(){ System.out.println("derived:"+str); System.out.println("derived-val1:"+val1); System.out.println("derived-val2:"+val2); System.out.println("derived-val3:"+val3); } }
package com.zhangcy.test.init; public class Basetest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /*float f = (short)10/10.2f*2; double d = (short)10/10*2;*/ Derived derived = new Derived(1); //derived = new Derived(10); //Derived derived1 = new Derived(20); Base base = new Derived(3); } }
1、父类的static变量,逐个上溯,找到最顶级的父类的static变量,依次往下初始化,直至当前类。
2、进入当前类的构造方法,构造方法第一句当然是调用父类的构造方法,依次上溯,找到最顶级的父类,先初始化父类的实例变量,再执行父类构造方法里面的语句,这样依次往下进入当前类,初始化当前类的实例变量,再执行当前类构造方法中调用父类构造方法之后的语句。
(未完待续)