2017-04-14 81 views
-1

我對finalstatic關鍵字的含義感到困惑。這是因爲,據我所知,static在課堂上創建了一個單獨的記憶。一個static字段只能從static方法訪問。那麼,爲什麼當我在Test構造函數中聲明list時沒有錯誤?如何使用final來實現靜態?

首先問

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);  
    } 
} 

它工作正常。但是當我加finalstatic,它不起作用。

第二個問題:

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); 
    } 
} 

請解釋它是如何工作的內部。

+0

你能細說正是你想在你的第二個問題已經解釋? – bleistift2

+0

之前加入最後的工作。在工作最後它不工作。第二個問題爲什麼它不工作和內部機制?@ bleistift2 –

+1

你從哪裏得到「一個靜態字段只能從靜態方法訪問」。這是不正確的。事實是,您無法從靜態方法訪問非靜態字段。所有其他組合都是允許的。 – Henry

回答

0

至於你的第一個問題,關鍵字static表示即使你沒有實例化類,變量也是可用的。例如,在您的示例中,即使您從未撥打new yourClass()yourClass.list也會引用列表。如果您忽略了static關鍵字,則yourClass.list在安裝該類之前還不存在

final關鍵字是用於聲明常量。即,變量被初始化(具有分配給它的第一次的值),要麼在構造後

public Test(){ 
    list = new ArrayList(); 
} 

或聲明它,private final List list = new ArrayList();後立即,它是不可變的。任何改變它的嘗試都會導致錯誤,例如使用另一個list = …語句。

+1

這是不正確的。該列表不是不可改變的,參考是。 – sschrass

+0

@sschrass謝謝你指出。我糾正了我的答案。 – bleistift2

0

檢查下面的代碼和附加的評論。

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沒有靜態類的概念。如果你想讓你的類的行爲類似於靜態類,那麼你可以將你的構造函數標記爲私有的。

注意:編寫靜態字段時還要考慮代碼將被使用的上下文並適當地記錄代碼。例如,您的代碼可能在多線程場景中使用。

注意:寫靜態字段時還要考慮你的代碼將如何測試。靜態可能會造成模擬相應代碼的困難。

+1

您也可以在聲明它們時初始化最終的靜態變量。例如,'final static ArrayList list = new ArrayList();'是有效的。 – bleistift2

+0

爲true,編輯後添加這一點 – andreim

0

由於最終變量可以,這就是爲什麼構造函數允許初始化變量啓動時初始化一次。在這裏,我們還得到了static這意味着您必須在類加載期間初始化該變量。這可以使用靜態初始化塊來完成。

static { list = new ArrayList(); }

0

使用靜態塊

public class timehelper { 
    public static final Map<String,String> timeType = new HashMap<String, String>(); 
    static { 
     timeType.put("Minute","60"); 
     timeType.put("Hour","24"); 
    } 
} 

你認爲正確的是靜態,並最終只意味着你創建後,你可以修改它。

1

問題-1

使用靜態關鍵字與物體能夠共享一個和穿過容器類的所有對象的相同副本。因此,如果初始化,重新分配該靜態對象,則該對象的所有對象都會更改。 您可以使用靜態引用來創建新對象,也可以重複指定它多次,但它會反映到容器類的所有現有對象和新對象中。您無法爲特定的容器類對象分配不同的值。 靜態變量可以從任何地方訪問,即使實例化容器類,使用類名稱後面是變量名前任何時間。 關於訪問靜態變量,您可以從任何靜態或非靜態訪問它的方法。但在靜態方法,你只能使用靜態變量或僅在該方法中聲明的變量。

問題-2

使用最終關鍵字與對象告訴編譯器應該有隻有一個和單個對象/值應與基準被聲明爲最終相關聯。 最終對象/變量應該僅在其聲明的時間進行一次初始化。其值/引用對象不能進一步更改/重新分配。這個我們稱之爲常量變量在C++中;

希望它有幫助。

乾杯.. !!