5

static final class variableとの間で混乱が生じてfinal 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が割り当てられていることがわかります。

4

6 に答える 6

12

だから私の質問は、異なるインスタンスごとに異なる値を持つことができない場合、最終的なインスタンス変数を持つことのポイントは何ですか。

それらは可能ですが、作成後にそれらの値を変更することはできません。インスタンス変数の初期化子とコンストラクター内の final インスタンス フィールドにのみ値を割り当てることができ、その方法ですべてのインスタンス フィールドに値を割り当てる必要があります。

ここのコードで次のことに注意してください。

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

…コメントが間違っています。その割り当ては完全に有効なはずです。

final フィールドは、不変性を実装するのに役立ちます。これにより、オブジェクトについて簡単に推論できます。たとえば、Stringは不変であるため、文字列を検証してから参照のコピーを保持すると、後で検証が正しく行われることがわかります。

これを と比較してください。バリデーションが有用であることを本当に信頼したいjava.util.Date場合は、値の防御コピーを作成し、他のコードへの参照を提供しない必要があります。Date

于 2012-10-31T12:08:05.180 に答える
2

Afinalは、値を代入するとすぐに final になります。後で変更することはできません。

于 2012-10-31T12:07:51.440 に答える
1

実際には、静的および非静的の最終変数は、クラス固有の変数を作成するときに必要であり、静的として宣言し、オブジェクトレベルの場合は非静的変数として宣言します。

たとえば、クラスとして国があり、タイムゾーンや重力など、そのクラスの2つのデータメンバーがあります。両方ともファイナルと宣言しましたが、タイムゾーンはオブジェクト固有であり(各国のタイムゾーンは異なりますが、全国で同じです)、重力はクラス固有です(各国の重力は地球の重力と同じです)。したがって、重力は静的ファイナルとして宣言されます。 。

于 2012-10-31T14:24:47.253 に答える
1

final宣言またはコンストラクターで初期化した後に変数を変更することはできません。

キーワードを使用しても変更可能staticにはなりません。クラス名またはインスタンス変数を介して変数にアクセスできることを意味するだけで、変数は依然としてimmutableです。final

于 2012-10-31T12:08:23.027 に答える
0

最終変数の場合、値を割り当てることができるのは1回だけです。これは通常、プログラムの後半で変数の値を変更したくない場合に使用されます。

静的変数は、作成するクラスのオブジェクトの数に関係なく、クラスごとに1つのインスタンスのみが作成されます。

于 2012-10-31T12:10:33.233 に答える
0

final変数は通常、決して変更してはならないものを定義するために使用されます。1 回書き込みを行うと、永久に設定されます。

これをコンストラクターで使用して、オブジェクトの ID などを設定できます。

于 2012-10-31T12:10:13.110 に答える