2017-04-15 32 views
-6

我有以下代碼:重新分配基準

public class Foo { 
    Bar mineBar; 
    class Bar { 
     int a; 
     public Bar(int a) { 
       this.a=a; 
     } 
    } 

    Bar getBar() { 
     return mineBar; 
    } 

    void reassingBar() { 
     //getBar()=new Bar(10); //doesn't work 
     mineBar=new Bar(10); 
    } 

    public static void main(String[] args) { 
    } 
} 

禰問題是,如果getBar()回報Bar那麼,爲什麼我就不能使用返回Bar並重新分配它引用一個新對象? 我不知道它在C++中有什麼不同嗎?

+0

這實際上是無效的Java AFAIK。 –

+3

因爲您只能分配給Java中的變量(或字段或數組元素)。這就是語言的定義。 –

+1

請刪除C++標籤。 – 2017-04-15 20:20:16

回答

1

這只是如何指定Java。從JLS Sec 15.26,分配的語法由下式給出:

Assignment: 
    LeftHandSide AssignmentOperator Expression 

LeftHandSide: 
    ExpressionName 
    FieldAccess 
    ArrayAccess 

所以LHS,必須爲一個變量,一個字段或一個數組元素。其他任何東西都是無效的語法。

您無法重新分配方法返回值的原因是因爲Java始終是通過值傳遞的。 getBar()方法返回的「參考」不是Foo.bar字段,它是一個有效的新變量,它也指向與Foo.bar字段相同的對象。因此,重新指定變量對Foo.bar字段的值沒有影響。

由於該「變量」只會在表達式被評估時才存在,所以沒有必要允許它:您也可以直接使用RHS的值。

這是從以下沒有什麼不同:

Object a = new Object(); 
Object b = a;  // a and b now refer to the same object. 
b = new Object(); // This reassigns b, but not a. 
+0

我明白了。我一直在考慮C++指針的Java引用。現在看來,使變量指向另一個內存地址的唯一方法就是能夠像'variable = newValue'一樣直接重新分配,不是嗎?所以我們只能在這裏更改公共變量,而在C++中,如果我們有它的內存地址,我們可以更改任何變量? – parsecer

+1

Java引用*與C++指針類似。但是你可以用一個指針來做的就是指向一個不同的值,或者對其進行解引用。如果你想''p = 5'來改變一個「指針」,'* p'不是一個指針,它是一個參考。 Java中沒有C++風格的引用。 –