为什么参考变量在本例中引用不同的值?

时间:2013-01-11 03:42:58

标签: java

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 version“1.7.0_10”

感谢所有人,我明白了我的错误。

6 个答案:

答案 0 :(得分: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对象的值。您只能使用不同的值创建新的Integer对象。

        System.out.print(aaa);
        System.out.print(bbb);
    }
}

答案 1 :(得分:1)

aaa = 4;表示aaa = new Integer(4);由于自动装箱而意味着aaabbb会在分配后引用不同的对象。

答案 2 :(得分: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的内容。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

bbb设置为aaa并不意味着在bbb稍后重新分配aaa时更新aaa = 4

答案 5 :(得分:0)

因为,在Java objects are defined as call by reference and types are defined as call by value

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

这是因为Integer是一个对象,而int是一种类型。