前两天网易的笔试把大家都虐的不行呀哈哈。
咳咳,还是言归正传,话说之间觉得java的对象类这一块掌握的还算OK的,仔细思考,发现还是有很多细节问题没有深入思考。
上代码~
1 public class B extends A { 2 public int m = method3(); 3 public static int n = method4(); 4 public int t = 0; 5 6 public B() { 7 System.out.println(4); 8 } 9 10 public int method3() { 11 System.out.println(5); 12 return 5; 13 } 14 15 public static int method4() { 16 System.out.println(6); 17 return 6; 18 } 19 20 public static void main(String[] args) { 21 // TODO Auto-generated method stub 22 System.out.println(7); 23 A a = new B(); 24 } 25 } 26 27 28 public class A { 29 public int i = method(); 30 public static int j = method2(); 31 public int k = 0; 32 public A() { 33 System.out.println(1); 34 } 35 public int method() { 36 System.out.println(2); 37 return 2; 38 } 39 public static int method2() { 40 System.out.println(3); 41 return 3; 42 } 43 }
将上述代码运行,显示的结果是:
3
6
7
2
1
5
4
一步一步的运行代码,便可从中了解初始化的顺序:
1.对父类的静态(static)变量初始化,对子类的静态变量初始化;依次输出3,6;
2.运行main函数,执行System.out.println(7);语句;输出7;
3.执行A a = new B();语句;
4.执行上一条语句会导致如下操作:
4.1转入到父类A构造方法,在执行父类构造方法的语句之前会依次初始化父类里面的普通变量;在初始化i时,输出2;
4.2执行父类A构造方法里面的语句;输出1;
4.1转入子类B构造方法,在执行子类构造方法的语句之前会依次初始化子类里面的普通变量;在初始化m时,输出5;
4.2执行子类B构造方法里面的语句;输出4;
对上面的输出顺序我们可以做一个总结
1.静态变量会在最先进行初始化;
2.在new一个新的对象时,会先处理父类的语句,再处理子类的语句;
2.调用构造函数,会先对类里面的普通变量进行初始化,再执行构造函数里面的语句。