2015-11-23 123 views
1

我有這個週六的Java考試,我在網站上有一個問題,我認爲,解決的辦法是錯誤的:多少個實例?

查找問題如下:

多少在內存中創建MarkList實例運行?

public class MarkList { 

    int num; 

    public static void graceMarks(MarkList objet4){ 
     objet4.num += 10; 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     MarkList obj1 = new MarkList(); 
     MarkList obj2 = obj1; 
     MarkList obj3 = null; 
     obj2.num = 60; 
     graceMarks(obj2); 

    } 

} 

該網站說:它是在運行時創建3個實例。

我認爲它創建了一個實例。

您能否給出您的觀點?

+1

我很喜歡99%的網站是錯誤的。我認爲只有一個實例被創建。 – markspace

+0

只有一個實例 –

+1

可能考試網站有'// TODO自動生成方法存根'應該避免 – wero

回答

6

你是對的。只有一個實例被創建,但它被引用三次。

的實例在這裏創建:

MarkList obj1 = new MarkList(); 

和引用的由obj1

MarkList obj1 = new MarkList(); 

obj2

MarkList obj2 = obj1; 

而且objet4

graceMarks(obj2); 
+1

有三個引用創建。第三個是調用方法時的「object4」參數。 – markspace

+0

@markspace是的,你是對的,錯過了那一個。 – m0skit0

+0

沒問題。 ;-) – markspace

0

只有。

Java中的對象只能用新操作符實例化。見this

這是隻用一次obj2obj3他們是一個由new操作

1

返回由於關鍵字new的指針引用,標誌着一個構造函數的調用,僅見於在示例代碼中的ONCE和構造函數調用的位置不在一個循環或多次調用的方法內,可以肯定地說只創建了ONE實例

1
MarkList obj1 = new MarkList(); 
    MarkList obj2 = obj1; 
    MarkList obj3 = null; 

相當於下面的C代碼大致爲:

MarkList* obj1 = (MarkList*)malloc(sizeof(MarkList)); 
    MarkList* obj2 = obj1; 
    MarkList* obj3 = null; 

正如你所看到的,你只分配一個,你會得到它的指針。然後,您只需創建一個存儲指針的第二個變量,並且該指針指向您在上面分配的實例。

這意味着只有一個實例。

編輯:在方法調用,

void graceMarks(MarkList* objet4){ 
    (*objet4).num += 10; 
} 

所以這還是解引用指針,因此仍然是相同的情況下,你所提供的。

0

在運行時實例僅通過new運算符創建,否則其他將被引用。 所以一個實例被創建。