为什么Java中的包装类不像引用类型?

时间:2017-06-25 12:28:58

标签: java class types reference wrapper

我有一个很大的问题需要理解为什么Java中的包装类不像引用类型那样。 例如:

Integer one = 10;
Integer two = one;
one = 20;
System.out.println(one);
System.out.println(two);

输出将是:

20

10

我认为two将是20,就像我创建自己的类的示例一样:

class OwnInteger {
        private int integer;

        public OwnInteger(int integer) {
            this.integer = integer;
        }

        public int getInteger() {
            return integer;
        }

        public void setInteger(int integer) {
            this.integer = integer;
        }
    }

    OwnInteger one = new OwnInteger(10);
    OwnInteger two = one;
    one.setInteger(20);
    System.out.println(one.getInteger());
    System.out.println(two.getInteger());

那么问题是,Integer包装类特别吗?为什么它的行为与我在示例中显示的一样?

4 个答案:

答案 0 :(得分:8)

这正是引用类型的行为。在您的示例中,two在分配后引用与one相同的对象。但是,重新分配one新对象对two没有影响,这是您看到的行为。

您也会看到与其他参考对象相同的行为,例如

StringBuilder one = new StringBuilder("10");
StringBuilder two = one;
one = new StringBuilder("20");
// two still references StringBuilder with "10"

为了让引用类在更改一个对象时显示行为也改变另一个对象,该类需要 mutable ,就像代码中的OwnInteger类一样, >和代码需要更改对象,而不是重新分配它。包装类(例如Integer)是不可变的,因此您不会遇到它们的行为。

答案 1 :(得分:3)

  

我认为两个人将是20 ...

nop,当你这样做时

Integer two = one;
one = 20;

您实际上是将新对象分配给变量one,变量two将不会更新这些更改......

到你的班级OwnInteger

OwnInteger one = new OwnInteger(10);
OwnInteger two = one;
one.setInteger(20);

他们按预期执行,因为onetwo指向相同的引用..

代码A将等同于

OwnInteger one = new OwnInteger(10);
OwnInteger two = one;
one = new OwnInteger(20); //one.setInteger(20);

答案 2 :(得分:0)

one = 20;

使用“拳击”,实际上相当于:

one = Integer.valueOf(20);

在您的情况下valueOf方法创建一个新对象并返回该新创建对象的引用,因为之前不存在于缓存中。

对于您自己的班级onetwo,两个参考变量都指向同一个对象。

答案 3 :(得分:0)

到目前为止,其他答案至少都是错误的。您看到的效果与自动装箱或可变性无关。像第一步一样更改指针并通过像第二步这样的指针更改对象是完全不同的事情。更改指针将其指向另一个对象。你没有改变这两个指针,所以他们指向不同的对象。无论可变性或拳击转换如何,都会发生这种情况。