2014-10-04 174 views
-2
Dog.setName("Kutta"); // this is how you call a setter method 
String Naam = Dog.getName(); 
System.println(Naam); //Kutta 
Naam = "Kutte ki Ma"; 
System.println(Dog.getName()); // Is this *Kutte ki Ma* or is it *Kutta*? 

爲什麼?如果Java按值傳遞引用,那麼不應該指向Dog.getName()?如果是這種情況,如果Naam被修改,Dog對象的Name變量是不是應該直接修改?這不是一個缺陷嗎?通過Java中的值傳遞引用

+6

'Dog.getName()=「Kutta」;'它會編譯? – Rustam 2014-10-04 10:13:45

+0

您需要發佈編譯代碼才能討論執行時間行爲......請發佈一個簡短但完整的程序來演示問題。 – 2014-10-04 10:16:18

+0

@hrishirc看看這個線程:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value特別注意第二個最好的答案,它解釋詳細所有你需要知道的。 – Alboz 2014-10-04 10:20:14

回答

1

因爲字符串是immutable,當你鍵入Naam = "Kutte ki Ma";你不改變現有的字符串對象,要創建一個新的和分配給您的Naam變量。

這是什麼意思是指派從來沒有實際去任何地方附近的狗的名字,仍然引用前一個字符串。因此,它不會改變。

+0

你認爲他們的程序會執行嗎? – Rustam 2014-10-04 10:20:12

+0

假設它是可變的,而不是一個字符串,比如一個int? – hrishirc 2014-10-04 10:20:19

+0

@hrishirc「int」是一個原語(那裏沒有引用)和「Integer」( 'int'的'Object'包裝器)是不可變的。 – 2014-10-04 10:38:55

1

以上都不是,因爲您在此處發佈的代碼從未設置Dog的名稱。如果你確實叫

Dog.setName("Kutta"); 

Java是通過值(但它的值是Object是它的參考)。 但是String在Java中是不可變的,並且您不能更新對由不同實例持有的String的引用。

如果你使用一個StringBuilder你可能會做這樣的事情,

public static void main(String args[]) { 
    Dog d = new Dog(); 
    d.getName().append("Kutta"); 
    StringBuilder Naam = d.getName(); 
    System.out.println(Naam); //Kutta 
    Naam.setLength(0); 
    Naam.append("Kutte ki Ma"); 
    System.out.println(d.getName()); 
} 

static class Dog { 
    private StringBuilder sb = new StringBuilder(); 
    StringBuilder getName() { 
     return sb; 
    } 
} 

你似乎期待哪位呢。