簡體   English   中英

最終實例變量的意義是什么?

[英]What is the significance of final instance variables?

我在static final class variablefinal instance variable之間有一些混淆。

以下是示例代碼: -

class Foof{
final int size=3;
final int whuffie;

    Foof()
    {
        whuffie=42; 
    }

    public static void main(String [] args){
        Foof obj1 = new Foof();
        Foof obj2 = new Foof();

        obj1.size=53;    //compile time error
        System.out.println(obj1.size);
        obj2.whuffie=45; //compile time error
        System.out.println(obj2.whuffie);
    }
}

錯誤:-

ankit@stream:/home/Data/JAVA/practice/src/test.com/test-20121031_static_demystified$ javac Foof.java 
Foof.java:14: error: cannot assign a value to final variable size
obj1.size=53;    //compile time error
    ^
Foof.java:16: error: cannot assign a value to final variable whuffie
obj2.whuffie=45;
    ^
2 errors

所以我的問題是,如果最終實例變量不能為每個不同的實例設置不同的值,那么它有什么意義呢? 我的意思是如果它們對於每個實例具有相同的值,那么為什么我們不將它們聲明為類變量(靜態最終類變量),因為這將起到相同的作用,並且我們不需要創建對象來訪問它們。


編輯-1: -

class Foof{
    final int size=3;
    final int whuffie;

    Foof()
    {
        whuffie=42;
        size = 23;  //compile-time error.
    }

    public static void main(String [] args){
        Foof obj1 = new Foof();
        Foof obj2 = new Foof();

        //obj1.size=53;    
        System.out.println(obj1.size);
        //obj2.whuffie=45; 
        System.out.println(obj2.whuffie);
    }
}

錯誤:-

Foof.java:8: cannot assign a value to final variable size
size = 23;
^
1 error

根據錯誤,我可以看出在創建對象期間第一個大小被賦值= 3。

所以我的問題是,如果最終實例變量不能為每個不同的實例設置不同的值,那么它有什么意義呢?

它們可以,但這些值在創建后無法更改。 您只能將值分配給實例變量初始值設定項和構造函數中的最終實例字段,並且必須將值分配給所有實例字段。

請注意,在您的代碼中:

Foof()
{
    whuffie=42;  //compile time error
}

......評論不正確。 這項任務應該是完全有效的。

最終字段對於實現不變性非常有用 - 這有助於簡化對象的推理。 例如, String是不可變的,因此如果您驗證字符串然后保留引用的副本,您就會知道稍后驗證仍然是正確的。

將其與java.util.Date進行比較,如果您確實希望驗證有用,則需要創建Date值的防御副本,並且不提供對任何其他代碼的引用,以防它更改底層即刻代表。

一旦你給它一個值, final就是決賽。 你以后不能改變它。

初始化聲明或構造函數后,您無法修改final變量。

使用static關鍵字不會使其可修改 它只是意味着可以通過類名或實例變量訪問final變量,該變量仍然是不可變的

實際上,當我們將任何變量創建為特定類時,需要靜態和非靜態最終變量,然后將其聲明為靜態,如果對象級別則將其聲明為非靜態變量。

例如,我們將一個國家作為一個類,並且將擁有該類的兩個數據成員,如時區和重力。 我們將它們都稱為最終,但時區是特定於對象的(每個國家的時區都不同,但在全國范圍內相同)並且引力是特定於類的(每個國家的引力與地球引力相同)因此我們將引力稱為靜態最終。

final變量通常用於定義永遠不會改變的事物。 你可以寫一次 ,然后永遠設置。

您可以在構造函數中使用它來為對象或類似的東西設置ID。

對於最終變量,您只能分配一次值。 它通常用於您不希望稍后在程序中更改變量值的情況。

靜態變量每個類只創建一個實例,而不管您創建的該類的對象數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM