引用的Integer对象未递增

时间:2014-10-06 11:14:41

标签: java

我正在开发一个java应用程序,现在我注意到一个令我困惑的奇怪行为。我有以下情况:

    Integer currentIndex = 0;
    doSomethings(currentIndex);
    System.out.println("Print "+currentIndex);


    private void doSomethings(Integer currentIndex){
        //Do other things and update my current index
        currentIndex++;


    }

但我总是像价值一样。我记得对象在java中像引用一样传递,而原始类型如copy。为什么我在这种情况下得到0?

7 个答案:

答案 0 :(得分:8)

Integer的实例不可变。这意味着你无法改变它的价值。当您将其增加1时,Integer会转换为int(这称为"unboxing"),然后此int会增加1。您甚至可以将其强制转换回Integer。但是这将是 Integer的另一个实例,而不是您传递给该方法的实例。这就是原始参考始终保持等于零的原因。

字节代码:

private static void doSomethings(java.lang.Integer);
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   aload_0
   1:   invokevirtual   #56; //Method java/lang/Integer.intValue:()I  --> get the int value of the Integer
   4:   iconst_1 --> constant value 1
   5:   iadd   --> add int value and 1
   6:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In --> get another integer with value increased by 1
teger;
   9:   astore_0
   10:  return

答案 1 :(得分:2)

这是一个有趣的结构。

请注意,Java中的对象不允许自定义运算符实现。并且没有为java对象定义++运算符。

所以java会做一个叫做“自动拳击”的技巧。这会将Integer转换为int,反之亦然。

当你这样做时会发生什么:

Interger myInt = 0;
int i = myInt++; // this line

如下: myInt将转换为int,然后该int值会递增并存储在i中。请注意,整数值不会保存到myInt

这是你的函数中发生的事情,++只发生在一个临时变量中,而不是在实际的Integer对象中。请注意,因为Integer对象是不可变的,所以甚至不可能。

答案 2 :(得分:1)

每个人都给出了正确的解决方案, beworker 也给出了很好的理由。我加上一个原因。

Java总是按值传递所有内容。因此,在传递currentIndex的代码中,它会按值传递,因此currentIndex方法中对dosomething()的任何更改都不会反映在块之外。

了解更多explanation。我推荐你看看Eng.Fouad的回答,他很好地解释了这个概念

答案 3 :(得分:1)

Java不是通过引用传递的。它是通过值(参考值)。上面的代码不起作用,因为Integer是一个Immutable类。所以你无法改变它的价值。

因此,您需要在方法中返回值,如下所示。

private Integer doSomethings(Integer currentIndex){

            return currentIndex++;   
 }

答案 4 :(得分:0)

    currentIndex = doSomethings(currentIndex);
    private Integer doSomethings(Integer currentIndex){
          //Do other things and update my current index
          return currentIndex++;     
    }

答案 5 :(得分:0)

完成以下代码

  Integer currentIndex = 0;
  currentIndex = doSomethings(currentIndex);
  System.out.println("Print "+currentIndex);


  private Integer doSomethings(Integer currentIndex,){
    //Do other things and update my current index
    return currentIndex++;

doSomethings()增加currentIndex的值并返回该值。然后将该对象存储到currentIndex引用

祝你好运!!!

答案 6 :(得分:0)

Java是值得传递的,这两篇文章解释得很好

http://www.javaranch.com/campfire/StoryCups.jsp http://www.javaranch.com/campfire/StoryPassBy.jsp

按顺序阅读。