public class AAA {
public static void main(String[] args) {
Integer bbb, aaa = new Integer(5);
System.out.print(aaa);
bbb = aaa;
System.out.print(bbb);
aaa = 4;
System.out.print(aaa);
System.out.print(bbb);
}
}
为什么结果我看到:5545而不是5544?
* java version“1.7.0_10”
感谢所有人,我明白了我的错误。
答案 0 :(得分:3)
public class AAA {
public static void main(String[] args) {
Integer bbb, aaa = new Integer(5);
System.out.print(aaa);
bbb = aaa;
上面一行指定bbb和aaa指向同一个对象。
System.out.print(bbb);
aaa = 4;
现在aaa指向一个新对象(通过自动装箱无形地创建)。这不更改bbb仍然指向的原始对象的值。请注意,Integer是不可变的。这意味着无法更改Integer对象的值。您只能使用不同的值创建新的Integer对象。
System.out.print(aaa);
System.out.print(bbb);
}
}
答案 1 :(得分:1)
aaa = 4;
表示aaa = new Integer(4);
由于自动装箱而意味着aaa
和bbb
会在分配后引用不同的对象。
答案 2 :(得分:1)
分配给引用变量会更改它指向的内容(如果有的话)。为了更改对象的值,以便通过两个或多个不同的引用可以看到更改,您需要一个其类支持值更改的对象。整数没有。 StringBuffer:
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer();
StringBuffer b = a;
a.append("Hello, world");
System.out.println(b);
}
}
a.append调用会更改a和b引用的StringBuffer的内容。
答案 3 :(得分:0)
bbb
不会随aaa
而改变。如果您希望程序打印5544,则必须在bbb
行下方aaa
重新定义aaa = 4;
。
答案 4 :(得分:0)
将bbb
设置为aaa
并不意味着在bbb
稍后重新分配aaa
时更新aaa = 4
。
答案 5 :(得分:0)
因为,在Java objects are defined as call by reference and types are defined as call by value。
如果您将其更改为int bbb, aaa = 5;
,结果将恢复到您的预期。
这是因为Integer
是一个对象,而int
是一种类型。