0

問題があります。いくつかのコードスニペットを試しているときに、コードに出くわしました。

class O
{
    final int i;
    O()
    {
        i=10;
    }
    O(int j)// error here as THE BLANK FINAL FIELD i IS NOT INITIALIZED
    {
        j=20;
        System.out.println(j);
    }
}
class Manager3
{
    public static void main(final String[] args) 
    {
        O n1=new O();
        //O n2=new O(10);
        //n1.i=20;
        //System.out.println(j1.i);
    }
}

しかし、パラメーターを使用してコンストラクターにコメントを付けても、エラーは発生しません。

私の質問は、コンストラクターをコードに入れたときにこのコンパイル時エラーが発生する理由と、パラメーター化されたコンストラクターを削除したときにエラーが発生しない理由です。

最終変数を初期化する必要があることはわかっていますが、コンストラクターで初期化するため、このコードを記述した場合:-

class O
{
    final int i;
    O()
    {
        i=10;
    }

}
class Manager3
{
    public static void main(final String[] args) 
    {
        O n1=new O();

    }
}

これはすべて正常に機能しており、コードはコンパイルされています。

私の質問は、別のコンストラクターを導入した場合の問題は何ですか。エラーでさえ、私がパラメーター化された短所を書いている行にあります。

私はJAVAを理解していますが、このコードで混乱しています。

4

4 に答える 4

7
final int i;

iとして定義しましfinalた。最終変数に値を割り当てることができるのは、コンストラクターのみです。

 O(int j)// error here as THE BLANK FINAL FIELD i IS NOT INITIALIZED
    {
        j=20;
        System.out.println(j);
    }

ここでは、に値を割り当てていませんi。誰かがこのコンストラクター(パラメーターを持つコンストラクター)を使用してオブジェクトを作成した場合、i値は割り当てられません。

これを解決する方法は?

あなたが言ったように、あなたはこのコンストラクターにコメントする必要があります(または)i他のコンストラクターで行ったようにこのコンストラクター内で値を割り当てます。

于 2012-10-24T15:36:56.967 に答える
3
   O(int j){
        this(); // <----- you can add this line. 
        j=20;
        System.out.println(j);
    }
于 2012-10-24T15:40:53.843 に答える
0

final変数は、宣言時に初期化するか、コンストラクター本体の値に割り当てる必要があります。変数を初期化しないfinalと、コンパイラエラーが発生します。

2番目のコンストラクターを呼び出すと、変数が値に割り当てられることはありません。

于 2012-10-24T15:39:30.613 に答える
0

「i」はインスタンスの最終変数であるため、定義するすべてのコンストラクターで初期化する必要があります。

于 2012-10-24T15:58:45.030 に答える