2014-09-10 36 views
0

在下面的代碼中,爲什麼在system.out.print打印數據時foo2爲空?這是如何適應java中「傳遞參考值」的?

public class Helper { 
    public void shadowCopy(Foo foo1, Foo foo2){ 
     foo2 = foo1; 
    } 

    public static void main(String[] args) { 
     Helper h = new Helper(); 
     Foo foo1 = new Foo(50); 
     Foo foo2= null; 
     h.shadowCopy(foo1, foo2); 
    System.out.println(foo2.data);// why java.lang.NullPointerException? 
    } 

    public static class Foo { 

     public int data=0; 
     public Foo(int data){ 
      this.data = data; 
     } 
    } 

} 
+0

Java只傳遞值,所以你的'shallowCopy'方法不會做任何事情。 – 2014-09-10 18:28:23

+0

@Cgraphics foo2爲空,所以它會使foo1也爲空。它通過引用而非價值。意思是你的整個對象是空的而不僅僅是數據部分... – StackFlowed 2014-09-10 18:28:33

+1

@Peter'shadowCopy',而不是'shallowCopy' – 2014-09-10 18:28:53

回答

2

shadowCopyfoo2是一個複製參照同對象foo2main被參照。但是,它僅分配其本地foo2引用來引用與foo1相同的對象。它不會更改main中的foo2參考變量,它仍然是null。這導致了NPE。

爲了得到想要的行爲,只需將foo2 = foo1;放在main中,這樣你就不會處理參考變量的副本。

0

那麼,因爲foo2在主要方法中爲null,並且您試圖訪問其data字段。

引用由值來傳遞,所以shadowCopy()基準的拷貝foo1到參考的拷貝分配給foo2。主要住宿中的價值foo2未經修改。