由于许多构造函数也调用超类构造函数,因此似乎可以认为在实例化子类时同时实例化子类和超类;即创建了多个对象。
仍然只创建一个对象吗?
谢谢
只有一个对象,即使调用了超级的构造函数,您也只是对一个对象执行额外的实例化。
是的,只创建了一个对象
在内存中只创建一个对象。
至少创建一个对象。谁知道构造函数中创建了多少对象?
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 ( ) ;
}
}
}
爱因斯坦有一句名言:解释应该尽可能简单,但不能简单。简单的答案“只有一个对象”可能是正确的,但错过了很多重要信息。
正如尼克所说,我们可以调用超类构造函数。这样超类构造函数就在“某处”,即使我只实例化了子类。很容易推理,子类的实例必须包括超类的所有成员(所有成员,直到 Object)。原则上,所有这些变量和方法都是子类实例。这些变量和方法还必须包括不被子类继承的变量。因此,实例不仅仅是子类声明或继承的内容。即猫是哺乳动物,即使哺乳动物声明了一些猫不继承的成员(一个糟糕的Java设计决策,IMO)。
例如,如果超类有一个私有变量“priv”,而公共访问器 getPriv() setPriv(),子类可以调用访问器,因此访问变量,修改状态等。但是“priv”本身并不存在在子类 .class 文件中找到。因此,实例不仅仅是“类”。
我将“子类不继承私有成员等”背后的基本原理留给其他讨论。对我来说从来没有任何意义(实例变量是这个实例的;那么你在说什么访问控制?一个对象不能访问它自己的部分?!......无论如何......这是设计师的决定)
顺便说一句,JVM 规范对如何实现继承语义只字未提(实际上也不应该说什么)。一种可能的解决方案(可能是也可能不是任何 JVM 所做的)是在创建子类的实例时创建所有祖先类的完整实例。为什么不?。不太可能有人会带着权威消息来源宣布不应该这样做。当然 JVM 规范没有这么说。
如果有人可以提供有关此主题的实际 JVM 实现信息的指针,那将很有启发性。我用google'ing找不到它。两者都找不到“只有一个对象”断言的权威证实。或许。我不知道。从概念上讲,作为一种 Java 语言结构?当然!但有“澄清”。实现方式,即“在内存中”?可能是,可能不是。
-马球