在Java中返回值

时间:2013-01-12 15:45:57

标签: java

我在理解相当基本的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

2 个答案:

答案 0 :(得分:5)

嗯,x是按值传递的 - 因为它是int类型,所以对被调用函数中x的任何修改都不会影响调用函数中的x 。您可以考虑将x中的值副本提供给被调用方,并且被调用方可以对其执行任何操作,而不会影响调用方范围内的x

对Java中的所有原始类型进行值传递。并通过引用传递其余部分(对象 - 注意数组是Object)。

另一件事是foobar方法中变量阴影的影响:x被声明为foobar的参数,因此该类成员x被遮蔽。 xfoo方法中对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类也是不可变的。