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());

 }

结果是:2 2 4 17

尽管 x 已更改,但 y 的值保持不变,而在对象中,更改会影响它们两者。所有原始类型(整数除外)是否都会发生同样的情况,为什么?

4

4 回答 4

2

Java确实以类似的方式对待存储在yobj2变量中的值(y = x分别obj2 =为 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每次immutable操作String都会创建新的String

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

此分配首先创建一个对象RandomObject并将其引用分配给obj1

obj2 = obj1;

现在obj1obj2两者都引用同一个对象。运行的任何操作obj1都会反映到创建的对象,同时被. 引用obj2。因此obj2也会显示任何操作对obj1直接或间接篡改创建的对象的副作用。

但是删除obj1like的引用obj1=null不会影响obj2,因为引用已更改并且obj2现在仅指向创建的对象。

更多信息在这里

于 2012-08-29T11:00:55.417 回答