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