运行以下程序,结果是( )
class A{
public int i = method();
public static int j = method2();
public int k = 0;
public A(){
System.out.println(1);
}
public int method(){
System.out.println(2);
return 2;
}
public static int method2(){
System.out.println(3);
return 3;
}
}
public class B extends A{
public int m = method3();
public static int n = method4();
public int t = 0;
public B(){
System.out.println(4);
}
public int method3(){
System.out.println(5);
return 5;
}
public static int method4(){
System.out.println(6);
return 6;
}
public static void main(String[] args){
System.out.println(7);
A a = new B();
}
}
A. 7,3,2,1,6,4,5
B. 3,6,7,2,1,5,4
C. 7,3,6,2,1,5,4
D. 3,2,1,7,6,5,4
这个题选择B答案.
解析:通常在运行程序时我们都知道从主函数开始执行,然后看见这个题第一反应就是第一个出来的答案一定是7,所以排除B,C.其实不是这样的
对这道题来说,主函数包含在子类B里面,但是B又是继承自A函数,JVM运行程序,会先进入到父类A中,按照类的初始化顺序 父类静态变量/静态块—>进入子类B中,继续子类静态变量/静态块,然后是主函数,最后再运行 A a = new B();继续初始化
类的初始化过程:
父类静态变量/静态块—>子类静态变量/静态块---->父类实例变量/实例块/构造方法---->子类实例变量/实例块/构造方法