我在理解相当基本的Java代码时遇到了一些麻烦,我无法弄清楚如何编译x = 2。因为通过我的逻辑它应该是4.代码本身:
public class eksami_harjutused {
public static int x=2;
public static int y=2;
public static void main(String[] args) {
foo(bar(foo(x)));
System.out.println("main x,y: "+x+" "+y);
}
public static int foo(int x) {
x++;
y++;
System.out.println("foo x,y: "+x+" "+y);
return x;
}
public static int bar(int x) {
int z=0, y=10, u=0;
--y;
for(y=1; y<(x*x); y++) {
for(z=1; z<x; z++) {
u++;
}
}
System.out.println("bar x,y: "+x+" "+y);
return z;
}
}
打印出来:
foo x,y:3 3
bar x,y:3 9
foo x,y:4 4
主x,y:2 4
答案 0 :(得分:5)
嗯,x
是按值传递的 - 因为它是int
类型,所以对被调用函数中x
的任何修改都不会影响调用函数中的x
。您可以考虑将x
中的值副本提供给被调用方,并且被调用方可以对其执行任何操作,而不会影响调用方范围内的x
。
对Java中的所有原始类型进行值传递。并通过引用传递其余部分(对象 - 注意数组是Object)。
另一件事是foo
和bar
方法中变量阴影的影响:x
被声明为foo
和bar
的参数,因此该类成员x
被遮蔽。 x
和foo
方法中对bar
的任何访问都将引用传入的参数,而不是类成员x
。
x
方法中打印的main
值来自类成员x
,在程序执行期间从未触及过。
相比之下,您可以在y
方法的2次调用中看到变量foo
被修改两次,因为y
方法中的foo
将引用类成员{ {1}}。但是,y
方法中的y
引用了bar
方法中声明的局部变量y
。
答案 1 :(得分:0)
因为int是按值传递的,所以你不希望x在foo()中递增。您可以尝试使用org.apache.commons.lang.mutable.MutableInt,因为Integer类也是不可变的。