0

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

仍然只创建一个对象吗?

谢谢

4

5 回答 5

4

只有一个对象,即使调用了超级的构造函数,您也只是对一个对象执行额外的实例化。

于 2012-04-10T02:18:48.693 回答
2

是的,只创建了一个对象

于 2012-04-10T02:18:42.540 回答
1

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

于 2012-04-10T02:19:15.080 回答
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 ( ) ;
         }
    }
}
于 2012-04-10T03:03:56.607 回答
-1

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

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

例如,如果超类有一个私有变量“priv”,而公共访问器 getPriv() setPriv(),子类可以调用访问器,因此访问变量,修改状态等。但是“priv”本身并不存在在子类 .class 文件中找到。因此,实例不仅仅是“类”。

我将“子类不继承私有成员等”背后的基本原理留给其他讨论。对我来说从来没有任何意义(实例变量是这个实例的;那么你在说什么访问控制?一个对象不能访问它自己的部分?!......无论如何......这是设计师的决定)

顺便说一句,JVM 规范对如何实现继承语义只字未提(实际上也不应该说什么)。一种可能的解决方案(可能是也可能不是任何 JVM 所做的)是在创建子类的实例时创建所有祖先类的完整实例。为什么不?。不太可能有人会带着权威消息来源宣布不应该这样做。当然 JVM 规范没有这么说。

如果有人可以提供有关此主题的实际 JVM 实现信息的指针,那将很有启发性。我用google'ing找不到它。两者都找不到“只有一个对象”断言的权威证实。或许。我不知道。从概念上讲,作为一种 Java 语言结构?当然!但有“澄清”。实现方式,即“在内存中”?可能是,可能不是。

-马球

于 2012-05-29T01:18:29.430 回答