0

Javaは実際にすべてのプリミティブ型をカスタムオブジェクトとは異なる方法で処理しますか?この単純な実験プログラムの結果を調べて「解釈」しようとしたときに、この質問を投げかけます。

public class RandomObject {

 String name;
 int value;

public RandomObject(String s, int i){
setName(s);
setValue(i);
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
 }

}


public static void main(String[] args) {

int x = 2;
int y = x;
System.out.println(y);
x = 4;
System.out.println(y);


RandomObject obj1 = new RandomObject("object1", 4);
RandomObject obj2;

obj2 = obj1;

System.out.println(obj2.getValue());
obj1.setValue(17);
System.out.println(obj2.getValue());

 }

結果は次のとおりです。22417

xは変更されましたが、yの値は不変のままですが、オブジェクトでは、変更は両方に影響します。同じことがすべてのプリミティブ型(整数以外)で発生しますか?その理由は何ですか?

4

4 に答える 4

2

Javay、変数とobj2変数に格納されている値(それぞれy = xobj2 =obj1`)を同様に扱いますが、主な違いは、Objectsの場合、変数には実際のオブジェクトへの参照のみが含まれ、データ値自体は含まれないことです。 。

int x,y;
x = 2;
y = x; //x = 2, y = 2
x = 3; //x = 3, y = 2 - Changing x does not change y

Object a,b;
a = new MyObject("foo"); //Create Object O on the heap, a = [Address of Object O]
b = a; //a = [Address of Object O], b = [Address of Object O]
a.updateValue("barr"); //Update a property of Object O
//a and b still contain [Address of Object O], but Object O has a new value.
a = new MyObject("Bazz"); //Create Object P, a = [Address of Object P]
//a = [Address of Object P], b = [Address of Object O]

注意すべき重要な点は、変数は、代入(=)ステートメントがある場合にのみ更新されるということです。

于 2012-08-29T10:54:13.213 に答える
2

Javaでは、任意のタイプのオブジェクトである変数には、それらが表すデータへの参照(ポインター)のみが含まれます。obj2をobj1に割り当てると、次のようになります。

obj2のアドレスを取得し、obj1に配置します。

ドット演算子「。」を使用する場合 あなたが言っています

そのアドレスのオブジェクト、そのオブジェクトをください。

任意のタイプのプリミティブである変数は、実際にはデータ自体を格納します。だからあなたが言うとき

int i = 2;
int j = 3;

j = i;

値2をjに格納します

于 2012-08-29T10:59:56.247 に答える
0

割り当てているだけです割り当てObj1 to Obj2 は両方に同じになります。値を変更しようとすると、の概念がImmutable浮かび上がります。

以下の例:

    String one = "String";
    String two = one;
    System.out.println("equal: " + one.equals(two));
    System.out.println("same:  " + (one == two));
    // Change one
    one = one.concat("concat");
    System.out.println("equal: " + one.equals(two));
    System.out.println("same:  " + (one == two));

出力します

equal: true
same:  true
equal: false
same:  false

のすべての操作が新しいを作成するためStringです。immutableStringString

于 2012-08-29T10:53:22.907 に答える
0
RandomObject obj1 = new RandomObject("object1", 4);

この割り当ては、最初にのオブジェクトを作成し、RandomObjectその参照をに割り当てますobj1

obj2 = obj1;

現在obj1obj2両方が同じオブジェクトを参照しています。実行された操作はすべてobj1、作成されたオブジェクトに反映され、同時に参照されます。したがって、作成されたオブジェクトを直接または間接的に改ざんするobj2操作obj2の副作用も表示されます。obj1

obj1ただし、 likeの参照を削除しても、参照が変更され、作成されたオブジェクトのみを指しているため、obj1=null影響はありません。obj2obj2

詳細はこちら

于 2012-08-29T11:00:55.417 に答える