前两天网易的笔试把大家都虐的不行呀哈哈。
咳咳,还是言归正传,话说之间觉得java的对象类这一块掌握的还算OK的,仔细思考,发现还是有很多细节问题没有深入思考。
上代码~
1 public class B extendsA {2 public int m =method3();3 public static int n =method4();4 public int t = 0;5
6 publicB() {7 System.out.println(4);8 }9
10 public intmethod3() {11 System.out.println(5);12 return 5;13 }14
15 public static intmethod4() {16 System.out.println(6);17 return 6;18 }19
20 public static voidmain(String[] args) {21 //TODO Auto-generated method stub
22 System.out.println(7);23 A a = newB();24 }25 }26
27
28 public classA {29 public int i =method();30 public static int j =method2();31 public int k = 0;32 publicA() {33 System.out.println(1);34 }35 public intmethod() {36 System.out.println(2);37 return 2;38 } 39 public static intmethod2() {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.调用构造函数,会先对类里面的普通变量进行初始化,再执行构造函数里面的语句。