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

ryb*_*usz 5 java types reference class wrapper

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

Integer one = 10;
Integer two = one;
one = 20;
System.out.println(one);
System.out.println(two);
Run Code Online (Sandbox Code Playgroud)

输出将是:

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());
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 8

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

例如,您将看到与其他引用对象相同的行为

StringBuilder one = new StringBuilder("10");
StringBuilder two = one;
one = new StringBuilder("20");
// two still references StringBuilder with "10"
Run Code Online (Sandbox Code Playgroud)

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