17

誰かが以下のコードの重要性を明確にすることができますか?

class A
{
    int i = 10;

    public void setI(int b)
    {
        i = b;
    }

    public int getI()
    {
        return i;
    }
}

class Test
{    
    public static void main(String args[]) throws Throwable
    { 
        final A ob = new A();
        ob.setI(10);
        System.out.println(ob.getI());
    }
}

オブジェクトAはfinalとして宣言されていますが、このオブジェクトのインスタンス変数の値を変更したり、更新された値を取得したりすることもできます。では、オブジェクトを最終として宣言することの重要性は何ですか。プリミティブデータ型をfinalとして宣言することを知っています。これにより、その変数が一定になります。

4

7 に答える 7

37

obは他のオブジェクトを参照できなくなります:finalkeyword

再割り当てすることはできません。ただし、その内部を変更することはできます(元々あった場合は変更可能です)。だからこれはうまくいく:

  final A ob = new A();
  ob.setI(6)

しかし、これはしません:

  final A ob = new A();
  ob = new A();
于 2012-06-29T10:26:18.607 に答える
12

変数がfinalであることを指定した場合、それは、メモリに含まれている値を変更したくないことを意味します。プリミティブ型の場合、変数で表される値が実際の値です。オブジェクトタイプの場合、メモリ内の値はオブジェクトへの参照であり、実際のオブジェクトではありません。

たとえば、次のようになります。

final int x = 7;
final Object y = new Object();

データは次のようにメモリで表されていると考えることができます。

+----------+----------+
|  block   |  value   |
+----------+----------+
|  1001    |    7     |
|  1002    |  2110    |
+----------+----------+

議論のために、Javaが実際にメモリを管理する方法の詳細は省略しましょう(私もそれについてあまり知らないため)。したがって、上記の例では、ブロック1001は変数xで表され、1002はyで表されます。どちらも最終変数です。つまり、それらが表す値は変更できません。xの場合は実際の値である7ですが、yの場合は2110は別のメモリ位置への参照にすぎません。どちらも変更できませんが、プリミティブ型の変数が定数になる理由は、実際の値を表すためです。しかし実際には、オブジェクト型変数についても同じことが言えますが、それらが表す定数は参照です。したがって、最後のキーワードはこの点でほぼ一貫しています。

したがって、final変数では、プリミティブ型の場合、設定した特定の値を常に表します。それらがオブジェクト/参照型である場合、それらは(オブジェクトの可変性に関係なく)あなたがそれらを指す任意のオブジェクトを常に指します。

于 2012-06-29T11:26:03.440 に答える
4

これは、次のことが不可能であることを意味します。

final A ob = new A();
ob = new A(); // This is not possible

変数は、最初に割り当てられたobクラスのインスタンスも参照します。Aこの場合、finalキーワードはそれを意味します。obこれは、の他のインスタンスと同様に通常のオブジェクトであるため、の属性を変更できることを意味しますA

于 2012-06-29T10:28:19.833 に答える
3

オブジェクトの場合、final通常どおり内部変更を行う任意のメソッドを呼び出すことができますが、別のオブジェクトを指すように参照を再割り当てすることはできません。これを試してみてください:

final A ob = new A();
ob = new A();

コードがコンパイルされないことに注意してください。

これを常に参照と考えてください。

于 2012-06-29T10:27:47.180 に答える
2

さて、オブジェクトの場合、参照の値はオブジェクトへのアドレスです。したがって、obの値は、それによって作成されたオブジェクトのアドレスになり、new A();最終的になり、その値を変更することはできなくなります。つまり、この参照に新しいオブジェクトを割り当てることはできません。

このように書くことはできません。

final A ob = new A();

ob= new A(); // not allowed
于 2012-06-29T10:28:31.900 に答える
1

Javaでは、C ++とは対照的に、すべてのオブジェクトはポインターであるため、finalオブジェクトを変更できます。新しい場所を指すことはできません。つまり、代入演算子の左側に配置することはできません。

于 2012-06-29T10:27:38.927 に答える
1

Javaにはconstant(final)オブジェクトはありません。オブジェクトはヒープメモリ領域に作成されます。オブジェクトはいつでも変更できます。
Javaにはconstant(final)参照のみがあります:-参照を変更して他のオブジェクトに再割り当てすることはできません。これは、定数であり、最終参照全体で、割り当てられている1つのオブジェクトのみを参照しているためです。宣言。

したがって :

 final A objectA = new A();
 objectA.setI(6);  

参照ではなく、オブジェクトのコンテンツのみを変更しているため、有効です。

だが:

   final A objectA = new A();
   objectA = new A();  

参照を変更しようとしているため、無効です。

于 2012-06-29T11:08:16.000 に答える