在Java中,以下声明之间有什么区别?

时间:2011-01-31 16:29:01

标签: java

考虑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++;
}

3 个答案:

答案 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上应用++运算符。对我来说,编译器不应该允许这样做。

相关问题