2017-03-16 107 views
-1

見測試代碼:如果Java是一種「按價值調用」的語言,那麼爲什麼會發生這種情況呢?

class Node 
{ 
    int num = 0; 
} 

class TestPassByReference 
{ 
    void increaseByOne(Node N) 
    { 
     N.num++ ; 
    } 

    public static void main(String args[]) 
    { 
     Node N = new Node() ; 
     TestPassByReference T = new TestPassByReference() ; 
     T.increaseByOne(N) ; 
     System.out.println("num = "+N.num) ; 
     T.increaseByOne(N) ; 
     System.out.println("num = "+N.num) ; 
     T.increaseByOne(N) ; 
     System.out.println("num = "+N.num) ; 
    } 
} 

其中給出結果:

num = 1 
num = 2 
num = 3 

這裏的問題是,既然Javacall by value那麼Nodenum屬性應該保持0

我認爲這是由於創建了一個對象T,它將包含一個對象N。但是T沒有屬性來保存類似對象的Node。那麼這是怎麼發生的呢?

任何幫助是邪惡的讚賞。

月亮。

+1

你有沒有看到這個:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value? –

+0

N是按值調用的。當用點引用該值時,將保留作爲對象引用的複製值並引用該對象。這稱爲其他語言的指針。 –

+4

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

回答

1

Java是按值傳遞的,意思是references是按值傳遞的。

這意味着可以(例如通過修改num字段的值)改變你傳遞N對象的內部狀態,但你不能重新分配到N一個新的對象(例如N = null;N = new Node();)。

class Node 
{ 
    int num = 0; 
} 

class TestPassByReference 
{ 
    void increaseByOne(Node N) 
    { 
     N.num++ ; 
     System.out.println("num value is:" + N.num); 
    } 

    void increaseByOneThenChange(Node N) 
    { 
     // increase by one as before 
     N.num++; 
     // change the reference to a new object 
     N = new Node(); 
     System.out.println("num value is:" + N.num); 
    } 

    public static void main(String args[]) 
    { 
     Node N = new Node() ; 
     TestPassByReference T = new TestPassByReference() ; 
     T.increaseByOne(N) ; 
     System.out.println("num = "+N.num) ; 
     T.increaseByOne(N) ; 
     System.out.println("num = "+N.num) ; 
     T.increaseByOne(N) ; 
     System.out.println("num = "+N.num) ; 

     // now try this method to see the difference 
     T.increaseByOneThenChange(N); 
     // N here is the original object, whose `num` value was incremented 
     // but the reference remains unchanged by the above method 
     System.out.println("num = "+N.num) ; 
    } 
} 

在第二種情況下,只有被傳遞給該方法的參考變化因此是僅在該方法中的主體(N將不再這裏指原始對象)可見,但是原來的保持相同。

3

Java通過引用傳遞對象。 Node N是一個對象。所以當你做N.num++時,你正在遞增同一個對象的整數。

0

在你的代碼中,你有一個Node對象。

保存的num值具有初始值0, 而當呼叫功能和num增量值的num每一時間值會增加,因爲同一節點的類對象。其簡單易懂的節點對象就是Node類的實例,如果你製作了另一個Node類對象,它將會有不同類的實例。

class Node 
{ 
    int num = 0; 
} 
class TestPassByReference 
{ 
    void increaseByOne(Node N) 
    { 
     N.num++ ; 
    } 
    public static void main(String args[]) 
    { 
     Node N1 = new Node() ; 
     Node N2 = new Node() ; 
     TestPassByReference T = new TestPassByReference() ; 
     T.increaseByOne(N1) ; 
     System.out.println("num = "+N1.num) ; 
     T.increaseByOne(N1) ; 
     System.out.println("num = "+N1.num) ; 
     T.increaseByOne(N2) ; 
     System.out.println("num = "+N2.num) ; 
    } 
} 

接着出來來的是:

num = 1 
num = 2 
num = 1 
0

好,您正在創建節點和TestPassByReference的單個對象因此T referes你早雲創建相同的節點參考。因此,當您調用該方法時,相同的值會增加。

相關問題