阿里java校招笔试题——代码块中语句的执行顺序

下面是阿里java校招的一道笔试题,代码如下:

public class HelloA {
    //构造方法
    public HelloA(){
            System.out.println("Hello A!父类构造方法");
    }
    //非静态代码块(构造块)    
    {
            System.out.println("i'm A class.父类非静态代码块");
    }    
    //静态代码块    
    static{        
    		System.out.println("static A 父类静态代码块");    
    } 
}
 
public class HelloB extends HelloA {
    //构造方法    
    public HelloB(){
            System.out.println("Hello B! 构造方法");    
    }    
    //非静态代码块(构造块)    
    {
            System.out.println("i'm B class.非静态代码块");    
    }    
    //静态代码块    
    static{
            System.out.println("static B 静态代码块");    
    }       
    public static void main(String[] args) {
            System.out.println("---start---");
            new HelloB();        
            new HelloB();        
            System.out.println("---end---");    
    } 
}
 

请写出上述代码的输出。
答案如下:

static A 父类静态代码块
static B 静态代码块
---start---
i'm A class.父类非静态代码块
Hello A!父类构造方法
i'm B class.非静态代码块
Hello B! 构造方法
i'm A class.父类非静态代码块
Hello A!父类构造方法
i'm B class.非静态代码块
Hello B! 构造方法
---end---

在上一篇博客《类与对象的继承和多态》中曾总结,java中的语句在执行过程中是有顺序的,顺序如下:

类属性、对象属性、静态块、构造块、构造方法、静态方法、普通方法。

在上述代码中,HelloA是HelloB的父类,两个类中都有静态块、构造块和静态代码块,
且在主类中定义的静态块,优先于main执行。
所以答案前两句输出为:

static A 父类静态代码块
static B 静态代码块

接下来执行main方法中的代码,“ new HelloB(); ” 这一条语句,程序转到HelloB这个子类中执行代码,HelloB的父类是HelloA,所以先执行HelloA中的代码,再回来执行HelloB中的代码,HelloA中有构造块和静态代码块,先执行构造块,再执行静态代码块,HelloB中同理,所以“ new HelloB(); ” 这条语句执行完毕后,输出应如下:

static A 父类静态代码块
static B 静态代码块
---start---
i'm A class.父类非静态代码块
Hello A!父类构造方法
i'm B class.非静态代码块
Hello B! 构造方法

接下来又是 “ new HelloB(); ” 这一条语句,过程如上述,最后执行main方法中的最后一条语句,输出结果就为上述所给的答案。

你可能感兴趣的:(java)