2014-09-02 56 views
0

我有一個看起來像下面的代碼的代碼。Java - 設置字段是否分配另一個內存?

public class Controller { 
    public void test(){ 
     Model1 model1 = new Model1(); 
     Test test = new Test(model1); 

    } 
} 

public class Test { 
    private Model1 model1; 

    public Test(Model1 model1) { 
     this.model1 = model1;//this line 
    } 

    public Model1 getModel1() { 
     return model1; 
    } 

    public void setModel1(Model1 model1) { 
     this.model1 = model1; 
    } 

} 
public class Model1 { 
    private String field1; 
    private String field2; 
    public String getField1() { 
     return field1; 
    } 
    public void setField1(String field1) { 
     this.field1 = field1; 
    } 
    public String getField2() { 
     return field2; 
    } 
    public void setField2(String field2) { 
     this.field2 = field2; 
    } 

} 

我只是想知道,這個代碼中實際創建了多少個Model1?
另一個問題是,這條線是通過引用傳遞並通過
通過引用在內存中良好?

+3

簡單規則1:通常,只有* new *會創建新對象。簡單的規則2:分配和傳遞參數都不會創建對象的副本/克隆/副本。 – user2864740 2014-09-02 02:05:17

回答

3

不,分配給一個字段不會分配內存。

只有在您(直接或間接)調用構造函數時纔會創建對象。

另一個問題是這行是否通過引用傳遞並且通過引用傳遞 在內存中是否好?

從技術上講,Java中的所有內容都是按值傳遞的。

但是,在對象的情況下,該值是對對象的引用(不是其內容的副本)。

因此,傳遞一個對象與傳遞一個long相同,就內存佈局而言。

2

只有一個在存儲器中的對象,由線:

Model1 model1 = new Model1(); 

和可變model1與當前對象的引用。

在構造

public Test(Model1 model1) { 
    this.model1 = model1;//this line 
} 

您將有另一個對內存中的同一個對象。

0

您已創建類Model的一個對象。基本上,您只能使用運算符new創建對象。

在java中,對象總是按值傳遞,而不管它們的類型如何。對於非基元類型(對象),您只能通過引用進行訪問。所以在你的情況下,你是通過價值傳遞參考。

通過引用傳遞對象在內存方面很好,因爲您只創建另一個指針,它需要4-8個字節之間的某個地方。

相關問題