2015-11-23 87 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运算符创建,否则其他将被引用。 所以一个实例被创建。