1

Java では、すべてのメソッドは値渡しですが、今日、コンストラクターは参照渡しであることを知りました。

// Attack the internals of a Period instance
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78);  // Modifies internals of p!

これは機能し、プライベート フィールドを編集できます。

この決定の理由は何ですか?または私は何かを逃していますか?

4

5 に答える 5

3

他の方法でも同じように機能します。実際には参照は値渡しです。

Class A{
   B b;
   void setB(B b) {
       this.b = b;
   }
};

A a;
B b;
A.setB(b);

b.change(); //changed in A

参照が値渡しされるとはどういう意味ですか?

void f(A a) {
    a.change(); // caller will see that object is changed. We change it using reference
    a = new A(); // we change the value of refernce. No changes are visible outside the function
    a.change(); //new object is changing. No changes are visible outside the function
}

基本的には、オブジェクトのアドレス (整数) を値で渡すだけです。すべてが整数です。クラスに整数が含まれています。そして、それは変わりませんでした。そのアドレスのオブジェクトはそうしました。

于 2013-07-13T09:10:53.970 に答える
1

いいえ、プライベート フィールドを変更していません。Period のプライベート フィールドは変更されず、引き続き同じオブジェクトを参照します。残念ながら、Date オブジェクトは可変です。したがって、Period オブジェクトを介して突然変異を確認できます。

これを回避したい場合は、コンストラクターに渡された各オブジェクトのコピーを作成してください。これにより、期間外の誰も変更できない独自の Date オブジェクトが作成されます。

于 2013-07-13T09:24:32.717 に答える