-4

以下のコード スニペットを実行すると、最終的な変数 X と Y に対してこの出力が得られます。

X = 1 Y = 2
X = 4 Y = 5

出力から明らかなように、最終的な変数が再割り当てされています。Java Final 変数の契約に違反しているかどうか疑問に思っています。何かご意見は?

public class FinalVariablesTest {

private final int x;
private final int y;

public FinalVariablesTest() {
    this.x = 1;
    this.y = 2;
}

public FinalVariablesTest(int xValue, int yValue) {
    this.x = xValue;
    this.y = yValue;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public static void main(String...strings) {
    FinalVariablesTest finalVariablesTest = new FinalVariablesTest();
    System.out.println(" X = "+finalVariablesTest.getX() + " Y = "+finalVariablesTest.getY());

    finalVariablesTest = new FinalVariablesTest(4,5);
    System.out.println(" X = "+finalVariablesTest.getX() + " Y = "+finalVariablesTest.getY());
}
}
4

5 に答える 5

5

いいえ、これは違反ではありません。2 つの別個のインスタンスがあり、それぞれに異なるfinal値が と にバインドされxていyます。

によって参照されるインスタンスが変更されましたfinalVariablesTest

于 2013-07-23T04:20:13.610 に答える
0

変数を Final として定義しました。

private final int x;
private final int y;

そして、完全に有効なコンストラクターでそれらに値を割り当てています。また、完全に合法で正しい異なる値を持つ FinalVariablesTest の 2 つの異なるインスタンスを作成しています。

ただし、次のようなことをした場合

private static final int x;
private static final int y;

コンストラクターで初期化することさえできません。最終フィールドはデフォルト値を取得せず、明示的に初期化する必要があります。final 変数は、初期化子または割り当てステートメントを介して一度だけ初期化できます。final インスタンス変数に値が割り当てられていない場合、コンパイラ エラーが発生します。

宣言中に初期化する必要があります

private static final int x = 0;
private static final int y = 0;

したがってprivate static final int y;、オブジェクトのインスタンスを作成せずに行うSystem.out.println(FinalVariablesTest.x);と、それは間違っているとしましょう。

したがって、あなたが行ったことは完全に有効で合法ですが、わずかな違いがあります(変数を静的にするため、変数は個々のインスタンスではなくクラスに属します)、実験したことを行うことはできません。

于 2013-07-23T04:32:17.060 に答える
0

System.out.println(" X = "+finalVariablesTest.getX() + " Y = "+finalVariablesTest.getY()); X=1 Y=2 & X=4 Y=5 も出力します。これは、新しいオブジェクトを作成し、既に作成されたオブジェクトに割り当てるためです。

于 2013-07-23T04:38:45.060 に答える
0

FinalVariablesTest クラスはシングルトンではないため、必要な数のオブジェクトを作成できます。また、作成したオブジェクト FinalVariablesTest Objectの値を変更することはできません。したがって、これは違反ではありません

于 2013-07-23T04:22:49.260 に答える
0

これらは厳密には変数ではなく、(最終的な) インスタンス フィールドです。Final インスタンス フィールドは、属するオブジェクトごとに 1 回だけ割り当てることができます。この例では 2 つのオブジェクトが作成され (2 つのnew FinalVariablesTest式があります)、そのようなオブジェクトごとにインスタンス フィールドに異なる値が割り当てられます。

ファイナリティの意味を確認するには、このメソッドをクラスに追加してみてください。

public vod setX(int newValue) {
  x = newValue;
}

setXこの変更により、(コンストラクターで) 既に割り当てられている final フィールドに割り当てようとするため、コンパイル エラーが発生します。

于 2013-07-23T04:23:49.930 に答える