[英]How to implement static with final?
我對final
和static
關鍵字的含義感到困惑。 據我所知,這是因為static
在類中創建了單獨的內存。 只能通過static
方法訪問static
字段。 然后,為什么在Test構造函數中聲明list
時沒有錯誤?
第一個問題 :
public Test() {
list = new ArrayList();
list.add("foo");
}
當我宣布
public class Test {
private static List list;
public Test() {
list = new ArrayList();
list.add("foo");
}
public static void main(String [] args) throws IOException{
list = new ArrayList();
Test t = new Test();
t.list.add("add");
System.out.print("Hello " + t.list);
}
}
工作正常。 但是當我用static
添加final
時,它不起作用。
第二個問題:
public class Test {
private static final List list;
public Test() {
list = new ArrayList();
list.add("foo");
}
public static void main(String [] args) throws IOException{
list = new ArrayList();
Test t = new Test();
t.list.add("add");
System.out.print("Hello" + t.list);
}
}
請說明其內部運作方式。
問題1
在對象上使用static關鍵字可以在容器類的所有對象之間共享一個相同的副本。 因此,如果初始化,請重新分配該靜態對象,該類的所有對象的確會更改。 您可以使用該靜態引用創建新對象,也可以根據需要對其進行多次分配,但是它將反映到容器類的所有現有對象和新對象中。 您不能為特定的容器類對象分配不同的值。 使用類名后跟變量名,甚至可以在實例化容器類之前,隨時隨地訪問靜態變量。 關於訪問靜態變量,您可以從任何靜態或非靜態方法訪問它。 但是在靜態方法中,您只能使用靜態變量或僅在該方法中聲明的變量。
問題2
對對象使用final關鍵字告訴編譯器應該只有一個,並且應該將單個對象/值與聲明為final的引用關聯。 最終對象/變量僅應在聲明時初始化一次。 其值/引用對象無法進一步更改/重新分配。 這就是我們在C ++中所謂的常量變量。
希望能幫助到你。
干杯..!!
檢查以下代碼和隨附的注釋。
public class Test {
// this can be set only once and only from the static block
private static final List listStaticFinal;
// this is initialized when declared
private static final List listStaticFinalInitialized = new ArrayList();
// this can be set many times from multiple places
private static List listStatic;
// this is initialized when declared
private static List listStaticInitialized = new ArrayList();
static {
// can set only once from here
listStaticFinal = new ArrayList();
// can be set also from here
listStatic = new ArrayList();
}
public Test() {
// can be set also from here
listStatic = new ArrayList();
}
public static void main(String[] args) {
// can be set also from here
listStatic = new ArrayList();
}
}
注意 :您只能在靜態塊中設置靜態最終字段。
注意 :Java沒有靜態類的概念。 如果您希望類的行為類似於靜態類,則可以將構造函數標記為私有。
注意 :在編寫靜態字段時,還請考慮將在其中使用代碼的上下文並適當地記錄代碼。 例如,您的代碼可能在多線程方案中使用。
注意 :在編寫靜態字段時,還要考慮如何測試您的代碼。 靜態可能會給模擬相應的代碼帶來困難。
由於最終變量只能在啟動期間初始化一次,因此允許構造函數初始化變量。 在這里,我們還得到了靜態信息 ,這意味着您必須在類加載期間初始化變量。 可以使用靜態初始化程序塊來完成。
靜態{list = new ArrayList(); }
對於第一個問題, static
關鍵字表示即使您不實例化該類,該變量也將可用。 例如,在您的示例中,即使您從不調用new yourClass()
, yourClass.list
引用列表。 如果您沒有使用static
關鍵字, 則在實例化該類之前, yourClass.list
尚不存在 。
final
關鍵字用於聲明常量 。 也就是說,在變量初始化后(首次為其分配了一個值),無論是在構造函數中
public Test(){
list = new ArrayList();
}
或在聲明之后立即private final List list = new ArrayList();
,這是一成不變的 。 任何嘗試更改它的嘗試(例如,使用另一個list = …
語句)都會導致錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.