1

我在理解非常基本的 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;       
   }           
}

它打印出来:

富 x,y: 3 3

条 x,y:3 9

富 x,y: 4 4

主要 x,y: 2 4

4

2 回答 2

5

好吧,x是按值传递的——因为它是int类型,所以对被调用函数的任何修改x都不会影响x调用函数。您可以考虑将 value 的副本提供x给被调用者,并且被调用者可以对它做任何事情而不会影响x调用者的范围。

Java 中的所有基本类型都是按值传递的。其余部分通过引用传递(对象 - 请注意数组是对象)。

另一件事是fooandbar方法中的变量遮蔽效果:x被声明为fooand的参数bar,因此类成员x被遮蔽。x对infoo和方法的任何访问bar都将引用传入的参数,而不是类成员x

x方法中打印的值main来自类成员x,在程序执行过程中永远不会触及。

相反,您可以看到变量y在 2 次方法调用中被修改了两次foo,因为yinfoo方法将引用类成员y。然而, yinbar方法是指在方法中y声明的局部变量bar

于 2013-01-12T15:50:03.010 回答
0

因为 int 是按值传递的,所以您不会期望 x 在 foo() 中递增。您可以尝试 org.apache.commons.lang.mutable.MutableInt 因为 Integer 类也是不可变的。

于 2013-01-12T15:53:48.643 回答