【问题标题】:why is increment in reference of integer class object manipulates integer value?为什么整数类对象的引用增量会操纵整数值?
【发布时间】:2015-09-28 05:12:22
【问题描述】:

我有一个基本的疑问,我们可以增加 Integer 类对象的引用,而不是任何其他类的引用(D 类有 1 个 Integer 数据成员和一个参数化构造函数)。

Integer x=new Integer(10); x++;
    D d=new D(10); d++;

这里 x 和 d 都是引用,我们仍然可以增加 Integer 引用,而不能增加任何其他引用。我错过了一些非常基本的东西,请帮帮我。

【问题讨论】:

标签: java object reference integer


【解决方案1】:
Integer x=new Integer(10); x++;

这里java编译器会做对象的un-boxing,把Integer对象转换成原始的int。然后将执行递增操作。这仅适用于 java 原语,auto-boxing 正在将原语转换为包装器对象,它的反向调用 un-boxing。这就是这里发生的事情。

auto-boxingun-boxing 是一种自动转换,它只为 java 原语定义。所以它不能在其他对象上执行。请记住,对象不仅仅是像C or C++ 这样我们可以递增它们的内存引用。

【讨论】:

  • 谢谢先生,这个拆箱概念可以应用于任何自定义类吗?
  • @uniquephase Autoboxing 介于简单类型(int、byte、...)及其相关类(Integer、Byte、...)之间。你的问题没有意义。如果您需要“增加” D 类的对象,请实现 D.increment()。
  • @uniquephase 不,不可能。没有办法让它编译。 java也不支持运算符重载。 Reference.
  • @YoungHobbit 先生,我想实现的是,如果我有一个包含一些整数成员的类。如果在创建对象和初始化之后,我会在引用中增加所有成员值。还有其他方法可以做到这一点,但由于缺乏自动装箱知识和查看整数类引用行为,我坚持这一点。感谢您的帮助!
  • @uniquephase 你需要提供你自己的实现。只是一个增加值的简单方法。
【解决方案2】:

这是因为从 jdk 1.5 引入的包装类的自动装箱。在内部,java 会将整数引用转换为 int 并递增它。你不能增加对象。

【讨论】:

  • 谢谢你!是否可以实现自动装箱,以便如果我增加对我的类的引用,它将增加我的类的数据成员?
  • @uniquephase,你不能为你的班级实现自动装箱。相反,您可以在 D 类中公开像 incrementX() 这样的简单方法,该方法将在您的 D 类中内部增加 x 的值。
【解决方案3】:

Java 无法为任意类重载运算符。因此,D d; d++ 不可用。你可以这样做:

public class D {
    private int value;
    public D( int v ){
        value = v;
    }

    public void increment(){
        value++;
    }
}

现在你可以做

D d = new D(10);
d.increment();

d 的值为 11。

【讨论】:

  • 你是对的,但我被困在参考增量上。从方法中,我们总是可以操作数据成员值。谢谢!
【解决方案4】:

根据Oracle Java Documentation,原始数据类型到其等效包装类型的自动转换称为autoboxing,相反的操作称为unboxing。每当我们在表达式中使用包装类的对象时,自动拆箱和自动装箱都是由 JVM 完成的。

Integer object;
object = 100;        //Autoboxing of int
++object;

当我们对 Integer 对象执行递增操作时,它首先被拆箱,然后递增,然后再次重新装箱为 Integer 类型对象。也可以看看How java auto boxing/unboxing works?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2015-04-26
    相关资源
    最近更新 更多