java - 为什么 Java 中的包装器类的行为不像引用类型?

标签 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 wrapper class 是特殊的吗?为什么它的行为与我在示例中所示的一样?

最佳答案

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

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

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

为了使引用类在更改一个对象的同时更改另一个对象时表现出行为,该类需要是可变的,例如代码中的 OwnInteger 类、代码需要更改对象,而不是重新分配它。包装类(例如 Integer)是不可变的,因此您不会遇到这种行为。

关于java - 为什么 Java 中的包装器类的行为不像引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44746379/

相关文章:

java - JUnit 测试事务方法

java - Tomcat 和我的 JSP/Servlet 应用程序之间的区别?

c++ - 当 Lua 绑定(bind)在该类中时,使用 LuaBind 在该类中调用 Lua 函数

C++ 传递成员函数作为另一个成员函数的参数

c++ - istream (ostream) 与 bool

java - 表 "places"没有名为 "smallDesc"的列

java - Android Studio Tab View 灰色主题颜色

python - Python 有类似 Java 的匿名内部类的东西吗?

javascript null 值 - 它是一个对象吗

swift - 不同类(class)类型