7

最終カントのマークが付いた参照変数が別のオブジェクトに再割り当てされました。オブジェクト内のデータは修正できますが、参照変数は変更できません。

私の理解に基づいて、155 の新しい UserId を再割り当てしようとしているコードを以下に作成しました。定義が進むにつれて、オブジェクト内のデータのみを変更しようとしています。でも参考書は同じ。

public class FinalClass 
{   
    public static void main(String[] args)
    {
        ChildClass objChildClass = new ChildClass(); 
        objChildClass.UserId = 155;
    }
}

class ChildClass
{
    public static final int  UserId = 145;  
}

上記の概念を誤解していると思います。

同じことを例を挙げて親切に説明してください。

返信ありがとうございます。

4

6 に答える 6

9

「=」演算子を使用して最終値を変更することはできません。これを行うと、参照 (またはプリミティブ) を変更しようとし、finalこれを変更できないと述べます。

既存のオブジェクトのフィールドを変更できます:

public static final User user = NewUser(145);

    public static void main(String[] args)
    {
        user.setId(155);
    }
于 2013-02-21T08:37:09.000 に答える
5

あなたの変更された質問では、変更によって機能するようになりますが、これがあなたの望むものかどうかはわかりません。

public class FinalClass 
{   
    public static void main(String[] args)
    {
        final ChildClass objChildClass = new ChildClass(); 
        ^^^^^
        objChildClass.UserId = 155;
        //objChildClass = new ChildClass();
    }
}

class ChildClass
{
    public static int  UserId = 145;  
                ^^^
}

これで objChildClass は final になり、そのメンバーを変更できますが、それが指すオブジェクトを変更することはできません。UserId は最終的なものではないため、変更できます。

于 2013-02-21T08:43:28.193 に答える
2

int はプリミティブ型であり、複合型への参照ではありません。http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2013-02-21T08:37:46.980 に答える
2

上記の概念を誤解していると思います。

あなたはそれを正しく理解しましたが、正しくテストしていません。UserId がid(または任意の名前の) プロパティを持つクラスである場合、その値は変更できますが、参照は変更できません。

ここでは、オブジェクトではなくプリミティブ型の変数を作成しています。同じテストにラッパー クラス Integer を使用してみてください。

于 2013-02-21T08:39:15.623 に答える
2

UserId はプリミティブ型である int 型であるため、オブジェクトとは異なる規則が適用されます。プリミティブ変数はポインターではなく、値そのものです。ただし、整数 (オブジェクト型) を使用していたとしても、プリミティブのラッパー型は不変であるため、その値を変更することはできません。

于 2013-02-21T08:38:15.877 に答える