4
public class A{
    public static final int j;
    public static int x; 
    static{ 
         j=9; 
    }
    public A(int j)
    {
         j = j;
    }
    protected void print()
    {
           System.out.println(j);
    }
}

上記のeclipseでコードを試すと、eclipseは、コンストラクターで変数「j」を初期化するために「変数jへの代入は効果がない」ことを示しています。

変数jが効果がない理由を教えてください。

4

6 に答える 6

6

パラメーターjは、クラス メンバーをシャドーイングjしています。次のようにコードを変更してみてください。

public A(int j)
{
     A.j = j;
}
于 2012-05-19T05:59:30.583 に答える
4

クラス変数 j (static final int j) には、静的ブロックで値 9 が割り当てられます。それはすべて有効です。

コンストラクターでは、パラメーター j がそれ自体に割り当てられますが、それは効果がありません。代替案(そして私はあなたが何を意味しているのかと思います)は次のとおりです。

public A(int j)
{
     A.j = j;
}

ここで、パラメータ j はクラス変数 j に割り当てられます。ただし、クラス変数が final であるため、Java はここで文句を言います。final キーワードを削除すると、もちろんこれも機能します。しかし、今では興味深いものになっています:

クラス A のインスタンスが作成されない限り、クラス j の値は 9 になります。クラスのインスタンスが new 演算子によって作成された時点で、クラス A のすべてのインスタンスは、クラス変数 j に対して同じ値を持ちます (コンストラクターに送信した内容によって異なります)。

于 2012-05-19T06:01:46.397 に答える
3

変数をそれ自体に割り当てることは、何もしないという正味の価値があります。

于 2012-05-19T05:40:21.473 に答える
0

変数に値を割り当てることfinalができるのは1回だけです。つまり、static変数のJVMの実行中に1回だけですが、コンストラクターはオブジェクトが作成されるたびに実行されます。

于 2012-05-19T05:39:27.007 に答える
0

使うthis.j = j;

を使用している間j = j、2 つの "j" は同じで、コンストラクターのパラメーターだけであり、クラス A のフィールドではありません。A のフィールド j が必要な場合は、を使用してくださいthis.j

于 2012-05-19T07:10:02.993 に答える
0

このを読みたいと思うかもしれません。あなたの場合のように、特定のケースでは、生成された警告が間違っていると言われています。

于 2012-05-19T05:49:20.157 に答える