1. 程式人生 > >阿里java校招筆試題——程式碼塊中語句的執行順序

阿里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方法中的最後一條語句,輸出結果就為上述所給的答案。