Java 引用的整数对象未递增
我正在开发一个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
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中的指针。