Java 引用的整数对象未递增

Java 引用的整数对象未递增,java,Java,我正在开发一个java应用程序,现在我注意到一个奇怪的行为,这让我很困惑。我有以下情况: Integer currentIndex = 0; doSomethings(currentIndex); System.out.println("Print "+currentIndex); private void doSomethings(Integer currentIndex){ //Do other things and update my c

我正在开发一个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++;


    }

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

检查以下代码

    currentIndex = doSomethings(currentIndex);
    private Integer doSomethings(Integer currentIndex){
          //Do other things and update my current index
          return currentIndex++;     
    }
  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引用中


祝你好运

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


按顺序阅读。

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

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

更多。我建议你们去看看福阿德的回答,他很好地解释了这个概念
这是一个有趣的结构

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

因此,java将使用一种称为“自动装箱”的技巧。这会将
Integer
转换为
int
,必要时也会将其转换为
int

当您执行以下操作时会发生什么:

Interger myInt = 0;
int i = myInt++; // this line
详情如下:
myInt
将转换为
int
,然后该int值递增并存储在
i
中。请注意,整数值不会保存到
myInt


这就是函数中发生的情况,
++
仅在临时变量中发生,而不是在实际的
整数
对象中发生。请注意,因为
Integer
对象是不可变的,所以这甚至是不可能的。

Integer的实例是不可变的。这意味着你不能改变它的值。当您将其增加1时,
Integer
被转换为
int
(称为),然后该
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

Java不是按引用传递的。它是传递值(引用的值)。上述代码不起作用,因为
Integer
是一个不可变的类。所以你不能改变它的值

所以,让您的方法工作,您需要在您的方法中返回值,如下所示

private Integer doSomethings(Integer currentIndex){

            return currentIndex++;   
 }

它与
++currentIndex
相同吗?该方法也应被称为:currentIndex=doSomethings(currentIndex);如果可能,避免在java中使用这些装箱类。如果您执行这样的操作,则后台会隐式取消装箱,如果您要返回它,则会重新装箱。您的方法
doSomething
不会返回任何内容,并且您会混淆自己是否有一个名为
currentIndex
的变量,该变量也是传入变量的名称。目前,您的方法只是增加传入的(本地)值,这与您在主调用代码中声明的值不同。Java中的引用有点像C中的指针。