考虑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++;
}
答案 0 :(得分:6)
唯一的区别是
Integer b = new Integer(5);
保证创建新对象。第一个将使用缓存中的实例(请参阅Integer.valueOf()
)。
两者都是不可变的,并且对两者的引用都是按值传递的(就像Java中的所有内容一样)。所以change()
对这两者都没有影响。
答案 1 :(得分:1)
我一直被教导a++
只是a = a + 1
的简写,在这种情况下,创建一个名为a
的局部变量,并在方法返回时立即丢弃。 Integer上没有方法可以更改值(它是不可变的),同样也没有对原始int进行操作来改变它们的值。
答案 2 :(得分:-1)
由于自动装箱/取消装箱,对change()的调用都不会影响传入的值。
public void change(Integer a) {
// This unboxes 'a' into an int, increments it and throws it away
a++;
}
上面的代码似乎暗示a ++会改变a的值,因为它是一个对象,而不是一个原始对象。但是,++没有被Integer重载,所以它将它解包,以便能够在其int上应用++运算符。对我来说,编译器不应该允许这样做。