2016-03-01 92 views
2

由於以下snipet,我得到了「1 0 1」,但我不知道爲什麼,所以我期待「1 ​​1 1」作爲結果。請任何人都可以向我解釋事情角落找尋如何去java計算的意外結果

public class Qcb90 { 
int a; 
int b; 
public void f() { 
    a = 0; 
    b = 0; 
    int[] c = { 0 }; 
    g(b, c); 
    System.out.println(a + " " + b + " " + c[0] + " "); 
} 
public void g(int b, int[] c) { 
    a = 1; 
    b = 1; 
    c[0] = 1; 
} 
public static void main(String[] args) { 
    Qcb90 obj = new Qcb90(); 
    obj.f(); 
} 
} 
+3

的'B'在'g'是它的功能參數,在'F'是成員的'B'。在'g'中使用'this.b'來分配給成員。 – BeyelerStudios

+1

this.a = 1; this.b = 1; – Damiano

+2

[Java是否爲「傳遞參考」或「按值傳遞」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass按值) –

回答

6

變化

b = 1; 

this.b = 1; 

你現在的樣子,你正在改變的參數(局部)變量未類成員變量。

+1

並且*局部變量*表示*參數*。 – Andreas

+0

更新以澄清。好建議。 – JustinKSU

+0

謝謝,現在沒問題 –

0

這是因爲int不是引用對象,例如它不是由new這個詞創建的對象,所以在將b傳遞給該方法的方法中,會爲此創建一個新變量,在這種方法中它可以是有效的。如果一個對象是由new這個詞創建的,那麼如果它被任何其他方法改變,它將會受到影響。

0

函數命名b參數g(int b, int[] c)類的成員變量b,所以要設置在g(int b, int[] c)稱爲b 1局部參數。這完全不會影響成員變量,並且在退出g後丟棄新值。

然而,當地參數c指針到在f分配的內存的拷貝,這樣你就可以修改,因爲指針的兩個副本的內容存儲器(傳過來的參數g副本也是原來的f)指向同一塊內存。

+0

感謝ù,現在感覺很好 –

0
public class Qcb90 { 
    int a; 
    int b; 
    public void f() { 
     a = 0; 
     b = 0; 
     int[] c = { 0 }; 
     g(b, c); 
    // so here b is your instance variable 
     System.out.println(a + " " + b + " " + c[0] + " "); 
    } 
    public void g(int b, int[] c) { 
     a = 1; 
     //b = 1; this b is a parameter of your method 
this.b=1; //now run your program 


     c[0] = 1; 
    } 
    public static void main(String[] args) { 
     Qcb90 obj = new Qcb90(); 
     obj.f(); 
    } 
    } 

如果你想打印b價值,你需要寫this.bg()

+0

謝謝,現在還好吧 –

+0

我想投你一票,但我不能這樣做,我是新手。 我需要獲得更多的信譽分數才能這樣做。對不起老兄 –