实例化子类时,是否只创建了一个对象?

时间:2012-04-10 02:17:19

标签: java object heap

由于许多构造函数也调用了超类构造函数,因此在实例化子类时,似乎可以认为子类和超类都被实例化了。即创建了多个对象。

还是只创建了一个对象吗?

谢谢

5 个答案:

答案 0 :(得分:4)

只是一个对象,即使调用super的构造函数,你只是在一个对象上执行额外的实例化。

答案 1 :(得分:2)

是的,只创建了一个对象

答案 2 :(得分:1)

只在内存中创建一个对象。

答案 3 :(得分:1)

至少创建一个对象。谁知道在构造函数中创建了多少个对象?

class X extends Y
{
    Object [ ] objects ;

    X ( int n )
    {
         super ( ) ;
         objects = new Object [ n ] ;
         for ( int i = 0 ; i < n ; i ++ )
         {
              objects [ i ] = new Object ( ) ;
         }
    }
}

答案 4 :(得分:-1)

爱因斯坦的一句话是:解释应该尽可能简单,但并不简单。简单的回答“只有一个对象”可能也许是正确的,但却错过了很多重要的信息。

正如尼克所问,我们可以调用超类构造函数。所以超类构造函数是'某处',即使我只实例化了子类。容易理由,子类的实例必须包括超类的所有成员(所有成员,直到Object)。原则上,所有这些变量和方法都是子类实例。这些变量和方法还必须包括子类未继承的变量。这样实例不仅仅是子类声明或继承的内容。即猫是一个哺乳动物,即使哺乳动物宣称某些成员Cat没有继承(一个糟糕的Java设计决定,IMO)。

例如,如果超类具有私有变量'priv'和公共访问器getPriv()setPriv(),则子类可以调用访问器,从而访问变量,修改状态等。但是'priv'本身不是在子类.class文件中找到的任何地方。因此,实例中的内容多于“仅仅是类”。

我接下来讨论“子类不继承私人成员等”背后的理由。从来没有对我有任何意义(实例变量是这个实例的;所以你在谈论什么访问控制?一个对象无法访问它自己的部分?!......无论如何......这是设计师的决定)

顺便说一句,JVM规范没有说明(实际上,不应该说什么)关于如何实现继承语义。一个可能的解决方案(可能是或不是任何JVM所做的)将在创建子类的实例时创建所有祖先类的完整实例。为什么不?。任何人都不可能有权威的来源声明不会这样做。当然JVM规范并没有这么说。

如果有人可以提供指向该主题的实际JVM实现信息的指针,那将是有启发性的。我无法通过谷歌找到它。两者都没有找到“仅一个对象”断言的权威性确认。也许。我不知道。从概念上讲,作为Java语言构造?当然!但有'澄清'。实施方式,即“在记忆中”?可能是,可能不是。

-Polo