2013-01-12 45 views
1

我在理解非常基本的Java代碼時遇到了一些麻煩,我無法弄清楚在編譯x = 2時如何。因爲通過我的邏輯應該4.代碼本身:在Java中返回值

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

棒X,Y:3 9

FOO的x,y:4 4

主X,Y:2 4

+1

當您發佈您打印的日誌時,它可以幫助其他人。 – WarrenFaith

+0

我建議你逐步調試器中的代碼。這樣你就可以看到每行代碼的功能。 –

回答

5

那麼,x通過值傳遞 - 因爲它是int類型,所以在被調用函數中對x的任何修改都不會影響調用函數中的x。您可以考慮將x中的值拷貝給被調用者,被調用者可以對其執行任何操作,而不會影響調用者範圍內的x

通過值傳遞是爲Java中的所有基元類型完成的。剩下的工作就是通過引用傳遞(Object - 注意數組是Object)。

另一件事是可變遮蔽在foobar方法的效果:x被聲明爲參數foobar,所以類構件x被遮蔽。任何訪問xfoobar方法將引用傳入的參數,而不是類成員x

main方法中打印的x的值來自班級成員x,在程序執行過程中永遠不會觸及該方法。

與此相反,可以看到可變y在2個呼叫到foo方法改性兩次,由於在y方法foo將引用類構件y。然而,bar方法中的y方法是指在bar方法中聲明的局部變量y

+0

非常感謝解釋,我不知道如何通過值來傳遞變量。 –

0

因爲int是通過值傳遞的,所以您不會指望x在foo()中增加。你可以嘗試org.apache.commons.lang.mutable.MutableInt,因爲Integer類也是不可變的。