运行下面代码,输出的结果是()
class A {
public A() {
System.out.println("class A");
}
{ System.out.println("I'm A class"); }
static { System.out.println("class A static"); }
}
public class B extends A {
public B() {
System.out.println("class B");
}
{ System.out.println("I'm B class"); }
static { System.out.println("class B static"); }
public static void main(String[] args) {
new B();
}
}
A. class A static class B static I'm A class class A I'm B class class B
B. class A static I'm A class class A class B static I'm B class class B
C. class A static class B static class A I'm A class class B I'm B class D. class A static class A I'm A class class B static class B I'm B class
此题选A。
要理解Java程序初始化顺序,就得理解虚拟机从加载、编译、运行一个类的过程:
静态代码域:包括静态变量、静态代码块,这些是随着虚拟机加载得时候就要执行得,且只会执行一次,它们之间得优先级是同等的,根据出现的先后来决定次序。
当运行一个子类程序时,JVM首先会先完成加载:
先父类再子类,所以会先执行父类和子类的静态代码域。
加载完成后,开始编译执行(走main方法入口):
main方法的代码是要new一个子类,所以首先会去初始化父类再去构造子类。而初始化父类的操作是,先是非静态代码块/变量,最后是构造函数。完成了父类的创建后,按照相同的规则去构造子类。