微信搜索《Java鱼仔》,每天一个知识点不错过
每天一个知识点
看完这篇类的实例化顺序,考执行顺序的面试题就难不倒你了
(一)先看一道面试题
一段代码的执行顺序经常会放到面试题或者笔试题中,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,它们的执行顺序,关于这一类题目只要了解了类的实例化顺序,就不会再成为问题。先看一下下面的面试题:
publicclassFather { privateinti=test(); privatestaticintj=method(); static { System.out.print("1 "); } Father(){ System.out.print("2 "); } { System.out.print("3 "); } publicinttest() { System.out.print("4 "); return1; } publicstaticintmethod(){ System.out.print("5 "); return1; } }
publicclassSonextendsFather{ privateinti=test(); privatestaticintj=method(); static { System.out.print("6 "); } Son(){ System.out.print("7 "); } { System.out.print("8 "); } publicinttest() { System.out.print("9 "); return1; } publicstaticintmethod(){ System.out.print("10 "); return1; } publicstaticvoidmain(String[] args) { Sons1=newSon(); System.out.println(); Sons2=newSon(); } }
观察上面的代码,给出输出结果:
正确的结果为:
网络异常,图片无法展示
|
(二)解答
类初始化
1、一个子类要初始化需要先初始化父类;
2、执行静态类变量和静态代码块从上到下执行。
所以第一遍创建Son对象实例的时候会先执行父类静态类变量和静态代码块,再执行子类。所以是5 1 10 6
实例初始化
1、先调用Super;
2、调用非静态实例变量和非静态代码块从上到下执行
3、调用无参构造方法
4、调用Super时注意父类的对象是否被子类重写,如果重写就按照子类的重写来计算。
所以先调用父类的test方法,因为被子类重写,输出9,再调用非静态代码,输出3,调用无参构造,输出2,同理子类输出987。