[英]In Java, what is the difference between the following declarations?
考虑Java。 这两个有何不同,为什么?
public void languageChecks() {
Integer a = 5;
Integer b = new Integer(5);
change(a); // a doesn't get incremented. value is 5
change(b); // b does. value is now 6
}
public void change(Integer a) {
a++;
}
唯一的区别是
Integer b = new Integer(5);
保证创建一个新对象。 第一个将使用缓存中的实例(请参阅Integer.valueOf()
)。
两者都是不可变的,并且对两者的引用都是按值传递的(就像Java中的所有内容一样)。 所以change()
对两者都没有影响。
我总是被教导a++
只是a = a + 1
简写,在这种情况下,创建a
名为a
的局部变量,并在方法返回时立即丢弃。 Integer上没有方法可以更改值(它是不可变的),同样也没有对原始int更改其值的操作。
由于自动装箱/取消装箱,对change()的调用都不会影响传入的值。
public void change(Integer a) {
// This unboxes 'a' into an int, increments it and throws it away
a++;
}
上面的代码似乎暗示a ++改变了a的值,因为它是一个对象,而不是一个原语。 但是,++没有被Integer重载,所以它将它解包,以便能够在其int上应用++运算符。 对我来说,编译器不应该允许这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.