繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM