初始化顺序总结起来就是:
1、无继承情况的初始化顺序:
2、有继承情况的初始化顺序:
下面给大家看一道面试题来巩固一下:
父类A.java:
public class A { String tag = "A"; public A() { System.out.println("A is constructed tag = " + tag); printTag(); } void printTag() { System.out.println("A printTag " + tag); } }
子类B.java:
public class B extends A { String tag = "B"; public B() { System.out.println("B is constructed tag = " + tag); printTag(); } void printTag() { System.out.println("B printTag " + tag); } public static void main(String[] arg) { A a = new B(); } }
运行结果是什么呢?大家可以动手试试,根据上面总结的初始化顺序下自己手写一份答案,然后再上机试一下正确与否。答案是:
A is constructed tag = A B printTag null B is constructed tag = B B printTag B
你是否做对了呢?
对于这道题给大家的警示就是千万别在初始化函数中调用重写的方法,因为在初始化子类实例的时候必先调用父类初始化函数,如果初始化函数中有子类重写的方法就会走到子类的重载方法中,而此时子类还没有完成初始化,所以变量都是未赋值的,所以会出现上面的输出结果。