4

Java がオブジェクトを処理する方法を確認するために次のテストを作成しましたが、かなり混乱しています。

public class MyClass
{
    public String text = "original";
    public MyClass(String text)
    {
        this.text = text;
    }
}

次に、次の 2 つのシナリオを作成しました。

1.

String object1 = new String("original");
String object2 = new String("original");
object2 = object1;
object2 = "changed";
System.out.println(object1);
System.out.println(object2);

結果:

original
changed

2.

MyClass object1 = new MyClass("object1");
MyClass object2 = new MyClass("object2");
object2 = object1;
object2.text = "changed";
System.out.println(object1.text);
System.out.println(object2.text);

結果:

changed
changed

テキスト フィールドが静的フィールドのように共有されるのはなぜでしょうか。

4

3 に答える 3

8

テキスト フィールドが静的フィールドのように共有されるのはなぜでしょうか。

この行を見てください:

object2 = object1;

これは、変数の値を変数object2の値と同じに設定することobject1です。これらの変数値はどちらもオブジェクトへの参照であり、オブジェクト自体ではありません。

したがって、その行の後、両方の変数が同じオブジェクトを参照する値を持ちます。1 つの変数を介してオブジェクトを変更すると、他の変数を介してその変更が表示されます。現実世界の言葉で言えば、自宅の住所が記載された 2 枚の紙切れがあり、2 人の異なる人にそれらを渡すとします。1 人目は玄関を赤く塗り、2 人目は家を訪れますが、それでも赤い玄関ドアが見えます。

3 つの概念を分離することが非常に重要です。

  • オブジェクト
  • 変数
  • 参考文献

変数 (または実際にはその他の式) の値は、常にプリミティブ値 (など) または参照のいずれかです。それは決してオブジェクト全体ではありません。intchar

ある変数の値を変更しても、別の変数の値は変更されないため、次のようになります。

String object1 = new String("original");
String object2 = new String("original");
object2 = object1;
object2 = "changed";

...object2一度 の値を と同じ値に変更しobject1、次に別の値にString変更して、テキストが「変更された」オブジェクトを参照します。の値が変わることはありませんobject1

それは役に立ちますか?そうでない場合は、非常に具体的なケースについて質問してください。一般化するよりも、いくつかの状況を詳細に取り上げるのが最も簡単です。

于 2012-06-01T08:30:16.583 に答える
4

この振る舞いを説明するための絵画的表現

ステップ1。

MyClass object1 = new MyClass("object1");
MyClass object2 = new MyClass("object2");

ステップ2。

object2 = object1;

ステップ3。

object2.text = "changed";

ここに画像の説明を入力してください

于 2012-06-01T10:55:47.917 に答える