15.运行下面代码,输出的结果是()

 运行下面代码,输出的结果是()

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一个子类,所以首先会去初始化父类再去构造子类。而初始化父类的操作是,先是非静态代码块/变量,最后是构造函数。完成了父类的创建后,按照相同的规则去构造子类。

猜你喜欢

转载自blog.csdn.net/QiuBika_061/article/details/90415794