阿里java校招筆試題——程式碼塊中語句的執行順序
阿新 • • 發佈:2018-12-28
下面是阿里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方法中的最後一條語句,輸出結果就為上述所給的答案。