混淆两种情况有什么区别?

时间:2013-08-18 10:29:45

标签: java object

我的问题与this SO问题有关。

我的第一个问题是,据我所知,对象的数量是3s1, s3 and "abc"(我发布了这个问题的答案)。如果有人说它是4。怎么会在那里发生?

考虑下面的课程。

public class ObjectCount {
    static int i;

    ObjectCount() {
        System.out.println(++i);
    }
    public static void main(String args[]) {
        ObjectCount obj1 = new ObjectCount();  //i=1
        ObjectCount obj2 = new ObjectCount(); //i=2
        ObjectCount obj3 = obj1; // obj3 is also an object refer same as obj1   
    }
}

有多少个物品?我认为它应该是2。所以上面的帖子如何回答可以是4个对象?有人可以帮我弄清楚哪里有些不正确的地方吗?

仅供参考:  现在上一期已修复该帖子。答案不正确是正确的。这是3个对象。无需担心。

5 个答案:

答案 0 :(得分:0)

您有3个变量obj1obj2obj3。但是,您有2次异议new ObjectCount();已创建。

答案 1 :(得分:0)

调用构造函数的次数=对象数

即2.然而,对象计数对象有3个引用。

  

obj1 ----->第一个对象

     

obj2 ----->第二个对象

     

obj3 ----->第二个对象

答案 2 :(得分:0)

If you see docs

  

new运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。 new运算符还调用对象构造函数。

     

注意:短语“实例化一个类”与“创建一个对象”意思相同。创建对象时,您正在创建类的“实例”,因此“实例化”一个类。

假设您正在references而不是objects,那么您只创建了两个Objects

答案 3 :(得分:0)

2个对象。第一个只有一个引用(来自局部变量obj1),第二个有两个引用(来自局部变量obj2obj3)。

关于你对原始问题的回答,我倾向于同意。字符串“abc”将仅作为对象创建一次,并根据需要多次引用。至少在Sun的JDK的前几个版本中都是如此。但是,AFAIK语言的这种行为没有强制,所以答案应该是“3或4,取决于实现”(事实上,一些疯狂的实现可能会创造更多)。回答“4”的人可能正在考虑一种不同的(更现代的)实施方式。

答案 4 :(得分:0)

有ObjectCount类型的对象。 ObjectCount有一个静态的int,所以它总共有三个对象。

当谈到另一个SO问题时,它也是三个对象,因为JVM正在重用字符串对象。如果他们使用了新的String(“abc”),那么他们将拥有4个对象。在您的示例中,所有ObjectCount对象都使用相同的整数实例。