如果在Android應用程序中使用以下兩個示例,有什麼區別?這兩種初始化靜態變量的方式有什麼不同?
例-1
public class ExampleClassOne {
public static int x = 9;
}
例2
public class ExampleClassTwo{
public static int x;
static{
x = 9;
}
}
如果在Android應用程序中使用以下兩個示例,有什麼區別?這兩種初始化靜態變量的方式有什麼不同?
例-1
public class ExampleClassOne {
public static int x = 9;
}
例2
public class ExampleClassTwo{
public static int x;
static{
x = 9;
}
}
作爲每Oracle tutorial:
public static int x = 9;
這種運作良好,當初始化值是可用的並且初始化可以是放在一條線上。但是,這種初始化形式由於其簡單性而具有侷限性。如果初始化需要某些邏輯(例如,錯誤處理或for循環來填充複雜數組),則簡單分配是不充分的。
實例變量可以在構造函數中初始化,其中可以使用錯誤處理或其他邏輯。爲了爲類變量提供相同的功能,Java編程語言包括靜態初始化塊。
什麼編譯器實際上做的是在內部產生一個類初始化程序,結合了所有的靜態變量初始化,所有的代碼靜態初始化塊,它們出現在類聲明的順序。這個單一的初始化過程是自動運行的,只有一次,當第一次加載類時。
但在你的情況下,用你的代碼,它沒有任何區別。
通常,static
塊用於更復雜的初始化,例如,如果您有List
並且想要填充它。
編輯(回滾;))在你的情況下,雖然初始化是等價的。
@TheNewIdiot初始化你爲什麼從我的答案中刪除我的編輯?在這個例子中,在這兩種情況下,OP的「int」是否都等同於初始化? – Mena
我很抱歉,這是我的錯,你可以回滾。 – NINCOMPOOP
@TheNewIdiot aha ok :) – Mena
它們都是相同的,並將在類創建/初始化時被調用和初始化。 沒有這種差異。
對於這個例子沒有區別。這兩種形式完全相同。 (的確,我懷疑生成的字節碼實際上是相同的。)
有些情況是有差別的。或者更確切地說,你可以表達的內容有所不同。映入腦海一對夫婦有:
一個static
初始化塊可以應付異常(尤其是那些檢查),但初始化表達式不能。
A static
初始化塊可以將靜態初始化爲任意複雜的語句序列的結果,但初始化表達式僅限於您可以在單個表達式中計算的結果。
話雖如此,我會建議您使用更簡單的初始化表達式形式儘可能。毫無疑問,它更具可讀性。
...尤其是因爲它總是*可能,因爲靜態初始化器僅僅是一個匿名靜態方法。 –
即使'公共靜態最終'可以從靜態塊 – sanbhat