由于许多构造函数也调用了超类构造函数,因此在实例化子类时,似乎可以认为子类和超类都被实例化了。即创建了多个对象。
还是只创建了一个对象吗?
谢谢
答案 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