我有一个很大的问题要理解为什么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包装类特别吗?为什么它表现得像我在我的例子中所显示的那样?
发布于 2017-06-25 12:32:15
这正是引用类型的行为。在您的示例中,two在赋值后引用与one相同的对象。但是,重新分配one一个新对象对two没有任何影响,这是您所看到的行为。
例如,在其他引用对象中也会看到相同的行为。
StringBuilder one = new StringBuilder("10");
StringBuilder two = one;
one = new StringBuilder("20");
// two still references StringBuilder with "10"为了使引用类在更改一个对象也更改另一个对象时显示出行为,类需要是可变的,就像代码中的OwnInteger类一样,代码需要更改对象,而不是重新分配对象。包装类(如Integer )是不可变的,因此您不会使用它们来体验这种行为。
发布于 2017-06-25 12:32:01
我以为两个人才20岁.
诺普,当你这么做时
Integer two = one;
one = 20;实际上,您正在将一个新对象分配给变量one,并且变量two不会随着这些更改而更新.
到您的类OwnInteger
OwnInteger one = new OwnInteger(10);
OwnInteger two = one;
one.setInteger(20);因为one和two指向相同的引用,所以它们做了您期望的事情。
代码A将等效于
OwnInteger one = new OwnInteger(10);
OwnInteger two = one;
one = new OwnInteger(20); //one.setInteger(20);发布于 2017-06-25 12:38:58
one = 20;使用“装箱”,实际上相当于:
one = Integer.valueOf(20);在您的示例中,valueOf方法创建一个新对象并返回该新创建对象的引用,因为以前缓存中不存在该对象。
对于您自己的类one和two,两个引用变量都指向同一个对象。
https://stackoverflow.com/questions/44746379
复制相似问题