2016-05-26 23 views
0

任何人都可以請解釋爲什麼實例變量'root'爲空?爲什麼實例變量在下例中爲空

public class Test{ 
    String root; 

    public void assignRoot(){ 
     baseAssignment(root); 
    } 

    public void baseAssignment(String root){ 
     if(root == null){ 
      System.out.println("root:"+root); 
      root = "assigned!"; 
      return; 
     } 

    } 

    public String toString(){ 
     return root; 
    } 

    public static void main(String args[]){ 
     Test t = new Test(); 
     t.assignRoot(); 
     System.out.println(t); 
    } 
} 

我的輸出是:

root:null 
null 

但我期待

root:null 
assigned! 
+0

嘗試從根目錄重命名參數名稱。神奇地看到它的工作;) –

+0

我不認爲這是一個傳遞引用與傳遞值的問題。這是一個範圍問題。 –

+0

@ cricket_007我們的目標不是爲了讓事情順利進行,而是爲了解決技術上的問題,爲什麼某些事情可行或不行。 – cyroxis

回答

0
if(root == null){ 
     System.out.println("root:"+root); 
     this.root = "assigned!"; 

你應該使用this.root因爲你只改變給定的參數命名爲root字符串的值太。

1

您只是將值分配給您的方法中的本地參數root,而不是類屬性root。重命名參數或使用前面的關鍵字this,它應該可以工作。 一個很好的解釋,爲什麼它的行爲,可以找到here

+0

「全局變量」不屬於java世界;我想你是說班級屬性? – Preuk

+0

@Preuk是的,謝謝。我真的不是Java人,但我用C#編程,因此我使用了這個名字。我編輯它。 –

0

這是我的方法參數應始終爲final。使得參數rootfinal會造成

root = "assigned!"; 

您必須分配給this.root編譯錯誤。你的代碼更改爲:

public void baseAssignment(final String root){ 
    if(root == null){ 
     System.out.println("root:"+root); 
     this.root = "assigned!"; 
     return; 
    } 

} 
+0

@Jack在我發佈我的答案後的一個多小時內,問題就以重複的方式結束。請不要試圖變得聰明。 –

+0

在回答這個問題之前,你還沒有嘗試搜索這個問題,這不是一個好的做法,如果你沒有發現任何比你必須回答的問題,首先嚐試搜索相關的問題,順便說一句,我不像你這樣聰明。 –

+0

@Jack我明白了。您正在閱讀「如何回答」手冊,查看我的答案,並指出您找到的任何錯誤。好吧,玩得開心。 –

1

因爲在baseAssignment()方法,你沒有初始化場root,你只需要改變局部參數root

相反的:

root = "assigned!"; 

你應該寫:

this.root = "assigned!"; 
4

沒有必要通過實例變量,方法的類中調用:

public class Test{ 
    String root; 

    public void assignRoot(){ 
     baseAssignment(); 
    } 

    public void baseAssignment(){ 
     if(root == null){ 
      System.out.println("root:"+root); 
      root = "assigned!"; 
      return; 
     } 

    } 

    public String toString(){ 
     return root; 
    } 

    public static void main(String args[]){ 
     Test t = new Test(); 
     t.assignRoot(); 
     System.out.println(t); 
    } 
} 

輸出:

$ javac Test.java 
$ java Test 
root:null 
assigned! 

或者您可以使用this.root="assigned!"來引用實例變量而不是本地參數。

+0

感謝您的解釋! – Pradeep

+0

@Pradeep歡迎..請點擊答案左側的刻度線,並解決問題:) – ritesht93

0

使用任何一種方法的..

public void baseAssignment(String root){ 
    if(root == null){ 
     System.out.println("root:"+root); 
     // root = "assigned!"; 
     this.root = "assigned!"; 
     return; 
    } 

} 

public void baseAssignment(String root1){ 
    if(root1 == null){ 
     System.out.println("root:"+root); 
     root = "assigned!"; 
     return; 
    } 

} 

它是如何解釋這個

Class MyClass{ 
String root=""; 
public void baseAssignment(String root){ 
    root = "local variable"; // pointing to method local variable root 
    System.out.println("root:"+root); 
    this.root = "class variable"; // pointing to class variable root 
    System.out.println("root:"+this.root); 
    } 
} 

輸出:

root:local variable 
root:class variable 
+0

這將有助於解釋爲什麼而不是隻發佈代碼,以便作者可以學習。 – cyroxis

+0

當我們在這種情況下考慮任何具有相同名稱的變量root時,內部方法/塊總是對本地變量執行的所有操作,指向外部變量需要明確提及「this」,因爲那將是一個類變量。請在我的回答的第三部分查看註釋行:) –

相關問題