2012-08-22 69 views
1

關於傳遞靜態方法的對象引用m1()爲什麼它不會變爲null以及爲什麼最後一條語句不會產生錯誤。輸出是X傳遞對象引用,沒有得到預期的結果。

class I { 
     private String name; 
     public String name() {    
      return name; 
     } 
     public I (String s) {    
      name = s;    
     } 
    } 

    class J { 
     public static void m1 (I i){ 
      i = null; 
     } 
     public static void main (String[] arg) 
     { 
      I i = new I("X"); 
      m1(i); 
      System.out.print(i.name()); 
     } 
    } 
+0

請編輯您的問題,以獲得一個明智的*標題*,然後在問題中的文本。 *只是*代碼的問題是相當差... –

+0

(我做了一個編輯,使事情有點更合理,但你應該進一步編輯它自己。) –

回答

1

Java是pass by value(閱讀專門的鏈接第二應答)的i

I i範圍僅限於方法m1只。

在執行中,它看起來是這樣的:

`I i` in `m1()` points to `null` reference 

I i method reference still points to `new I("X");` 
1

Java是按值傳遞這樣的i範圍如果您在方法M1,改變i名(僅限於M1()

public static void m1 (I i){ // i is copied from i which is in main method but it is another variable whose scope lies within m1() only 

    i = null; // original i in main lies in main() method scope 

} 

),混淆將會更小:

public static void m1 (I iObj){ 
    iObj = null; // i in main() method still points to Object 

} 
+0

所以方法是靜態或實例並不重要這個案例? – rg665n

+0

@ user1617840:我們說的方法,適用於所有的方法。 –

1

Java使用專門傳遞值。更改i的值m1只有更改該參數的值。它不會將任何東西main內的變量i做比較。

什麼可以迷惑你 - 它肯定混淆了許多其他的人 - 是,雖然參數是按值傳遞,如果該參數的類型是一個類,則該值是參考 ...的確在每種情況下,i變量的值都是參考。該引用仍然按值傳遞 - 參數的值直接複製爲參數的初始值。然而,如果不是改變參數本身進行更改的對象參數值來,這是一個不同的問題:

void foo(StringBuilder builder) { 
    builder.append("Hello"); 
} 

void bar() { 
    StringBuilder x = new StringBuilder(); 
    foo(x); 
    System.out.println(x); // Prints Hello 
} 

有關詳細信息,請參閱Java tutorial on passing information to a method or constructor

+0

所以方法是靜態的或實例在這種情況下無關緊要? – rg665n

相關問題