3
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版本“1.7.0_10”

谢谢大家,我理解我的错误。

4

6 回答 6

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 对象。

        System.out.print(aaa);
        System.out.print(bbb);
    }
}
于 2013-01-11T03:50:16.103 回答
1

aaa = 4;意味着aaa = new Integer(4);由于自动装箱,它意味着aaa并且bbb将在分配后引用不同的对象。

于 2013-01-11T03:52:38.700 回答
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 的内容。

于 2013-01-11T05:05:34.027 回答
0

bbb不随 改变aaa。如果您希望程序打印 5544,则必须在该行bbbaaa正下方重新定义。aaa = 4;

于 2013-01-11T03:45:13.963 回答
0

设置bbbaaa并不意味着稍后重新分配bbb时会更新( )。aaaaaa = 4

于 2013-01-11T03:45:26.903 回答
0

因为,在Java 中,对象被定义为按引用调用,而类型被定义为按值调用

如果您将其更改为int bbb, aaa = 5;结果将回到您的预期。

这是因为 anInteger是一个对象,而 anint是一个类型。

于 2013-01-11T04:02:01.473 回答