2015-09-08 96 views
-1

我有一個關於這個場景查詢關於靜態塊

我有2個班 A類和B類內的2個不同的套餐如下的問題。

Package test1 // first Package 
public class B 
{ 
public static int q = 10; // having one static variable 
static 
{ 
system.out.println ("test")// One static block which is printing something 
} 
} 

第二包因此,在這種情況下

Package test 
import test1.B // Importing class B from Package test1 
public class A 
{ 
int c = B.q // reading the value q from class B 
} 

當我將執行類A中的靜塊是在B類

靜態{的System.out.println(」內測試「)}

將被執行或不執行。

+0

請花時間格式化您的代碼 - 如果沒有縮進,確實很難閱讀。 –

+2

接下來,您可以非常輕鬆地測試您的問題 - 只需運行該代碼(在您已解決使用這些包語句編譯不了的事實之後...)是否有任何理由不能這樣做? –

+0

@ user2256009只要你的B類加載到JVM中,靜態塊就會被執行。 –

回答

3

只要類加載到虛擬機中,靜態初始化塊就會立即執行。您的代碼正在訪問類B中的一個靜態字段,這會導致該類被加載並執行靜態初始化程序。

A類是否延伸B類也沒關係。

+0

在創建類A的實例之前,不需要加載B類。 OP顯然沒有向我們展示所有的代碼,所以目前還不清楚B類是否會被加載(或者是A類)。 –

+0

在這種情況下,只有在創建A的實例時纔會加載B類,因爲B類用於設置A類的非靜態對象。 – Stanislav

1

根據specification,當JVM加載Class時,將執行靜態初始化程序。所以,這意味着,無論何時您獲得A類實例,您的情況都會毫無疑問地執行。

+1

這假定B類將被加載。不知道更多關於代碼的信息,目前還不清楚這是否會發生。 –

+0

是的,你必須得到一個類A的實例,但據說A類將被使用,假設它意味着它將被實例化。剛剛指定我的答案。謝謝。 – Stanislav