classBextendsObject{static{System.out.println("LoadB");}publicB(){System.out.println("CreateB");}}classAextendsB{static{System.out.println("LoadA");}publicA(){System.out....
class B extends Object {
static {System.out.println("Load B");}
public B(){System.out.println("Create B");}
}
class A extends B {
static {System.out.println("Load A");}
public A(){
System.out.println("Create A");}
}
public class Test {
public static void main(String[] args){
A a = new A();
}
}
这是alibaba笔试题,求输出的顺序?
答案为Load B-->Load A-->Create B-->Create A;
有一点不明白,为什么是先加载B类后加载A类;
我的理解是主函数运行到A a = new A();这句话的时候,发现构造对象a需要用到类A这个模板,所以就将类A加载到内存中,加载过程中其内部的静态代码块被执行,输出Load A,模板准备好后,接下来就是真正构造对象a了,调用构造方法A(),该构造方法内隐含的第一条语句是super();所以调用super();即构造父类对象,但发现内存中没有用于构造父类对象的模板(B类),所以又将B类加载到内存中来,加载过程中执行B类中的静态代码,输出Load B;待B类模板在内存中准备好后,就可以构造B类对象了,所以调用构造方法B();输出Create B; 接着回到A类的构造方法,执行super();后面紧接着的语句,即输出Create A;
所以顺序为Load A-->Load B-->Create B-->Create A;
这是为什么?哪里理解错了,请高人帮忙解答。
展开