【问题标题】:How Wrapper classes worksWrapper 类的工作原理
【发布时间】:2013-06-21 20:40:28
【问题描述】:
Integer x = 400;
Integer y = x;
x++;

此时 x 是 401,y 是 400。但我认为两者都指的是同一个对象,都应该是 401。 我不知道这是怎么回事。请帮忙。

【问题讨论】:

标签: java


【解决方案1】:

在此图像中,当您增加 X=X+1 的值时,它将创建新的引用,而不是指向同一个引用。因此,在增加 X 的值后,X 将指向 401。Y 将指向 400因为 Y 没有增加。

【讨论】:

    【解决方案2】:

    操作码说明一切。

    package wrapperInteger;
    
    public class WrapperTest {
    
    
    public static void main(String[] args) {
    
        Integer x =400;
        Integer y=x;
        x++;
        y--;
    
    
    }
    

    }

    操作码:

    如果你意识到 x 对应 #16,y 对应 #22。所以证明这两个变量指向的是不同的对象。

    Compiled from "WrapperTest.java"
    public class wrapperInteger.WrapperTest extends java.lang.Object{
    public wrapperInteger.WrapperTest();
      Code:
       0:   aload_0
       1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
       4:   return
    
    public static void main(java.lang.String[]);
      Code:
       0:   sipush  400
       3:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       6:   astore_1
       7:   aload_1
       8:   astore_2
       9:   aload_1
       10:  invokevirtual   #22; //Method java/lang/Integer.intValue:()I
       13:  iconst_1
       14:  iadd
       15:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       18:  astore_1
       19:  aload_2
       20:  invokevirtual   #22; //Method java/lang/Integer.intValue:()I
       23:  iconst_1
       24:  isub
       25:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       28:  astore_2
       29:  return
    }
    

    【讨论】:

    • 谢谢...你能告诉我更多关于操作码的信息吗..它描述了什么..如何获取此代码
    • >javap -c WrapperTest.class 打印 java 编译代码。 Opcode 就像是由 JVM 执行的机器语言。 JVM 执行此代码。
    【解决方案3】:

    java中的所有包装类都是immutable。所以每次都会创建一个新的instanceinstance。 当然为每个实例携带不同的价值。

    【讨论】:

      【解决方案4】:

      整数是不可变的。因此,当您将一些值复制到它时,它正在创建对象的一个​​新实例

      【讨论】:

        【解决方案5】:

        因为x++ 实际上与x = x + 1 相同。 x + 1 是一个不同 Integer 对象,x 已更新为引用此另一个对象。

        【讨论】:

        • +1 由于自动装箱,它可能不会创建一个新的 Integer,但它会是一个不同的 Integer。例如-XX:+AggressiveOpts可以将Integer缓存增加到10K或者20K
        • 请看我的回答,它从不同的完美状态证明。
        猜你喜欢
        • 1970-01-01
        • 2022-01-16
        • 2018-03-11
        • 1970-01-01
        • 2019-01-24
        • 2021-03-20
        • 2011-10-26
        • 2017-12-02
        • 2014-04-04
        相关资源
        最近更新 更多