我正在开发一个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?
答案 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
按顺序阅读。