我很难理解为什么 Java 中的包装类的行为不像引用类型。 示例:
Integer one = 10;
Integer two = one;
one = 20;
System.out.println(one);
System.out.println(two);
输出将是:
20
10
我认为 two
将是 20,就像在我创建自己的类的这个示例中一样:
class OwnInteger {
private int integer;
public OwnInteger(int integer) {
this.integer = integer;
}
public int getInteger() {
return integer;
}
public void setInteger(int integer) {
this.integer = integer;
}
}
OwnInteger one = new OwnInteger(10);
OwnInteger two = one;
one.setInteger(20);
System.out.println(one.getInteger());
System.out.println(two.getInteger());
那么问题来了,Integer wrapper class 是特殊的吗?为什么它的行为与我在示例中所示的一样?
最佳答案
这正是引用类型的行为。在您的示例中, two
在赋值后引用与 one
相同的对象。但是,重新分配 one
一个新对象对 two
没有影响,这是您看到的行为。
您也会看到与其他引用对象相同的行为,例如
StringBuilder one = new StringBuilder("10");
StringBuilder two = one;
one = new StringBuilder("20");
// two still references StringBuilder with "10"
为了使引用类在更改一个对象的同时更改另一个对象时表现出行为,该类需要是可变的,例如代码中的 OwnInteger
类、和代码需要更改对象,而不是重新分配它。包装类(例如 Integer
)是不可变的,因此您不会遇到这种行为。
关于java - 为什么 Java 中的包装器类的行为不像引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44746379/