【发布时间】:2014-02-17 18:18:18
【问题描述】:
我想我们已经在Inheritance in Java simple clarificationInheritance in Java simple clarification的这篇文章中讨论了这个问题
但由于这里的示例有点简单,而且我想澄清的点不同,我会试一试。
首先讨论两个类:
public class SuperClass{
SuperClass() {
foo();
}
public void foo() {
System.out.println("Super.foo()");
}
public static void main(String[] args) {
SuperClass tn = new DerivedClass();
tn.foo();
}
}
public class DerivedClass extends SuperClass{
String i;
TrickyB() {
i = "aksjhdf";
}
public void foo() {
System.out.println("In derived.foo() --> " + i);
}
}
我(至少我认为)理解多态性的概念,并且我知道为什么在调用时会调用DerivedClass.foo()
new DerivedClass();
我在这里看到了不一致:
在我们调用 DerivedClass 的 c´tor 时,SuperClass 的 c´tor 被隐式调用(可以说是 Derived c´tor 的第一行)。
所以在 Super c´tor 中,DerivedClass 没有完全初始化,这使得使用这个类毫无用处。
这一点反映在这个程序的输出中
In derived.foo() --> null
In derived.foo() --> aksjhdf
第一行反映了我的困惑:
为什么会调用DerivedClass.foo()?对象还没有准备好,所以用它做任何事情在我看来都是无稽之谈。
谁能给我解释一下原因。我认为这绝对违反直觉。
顺便说一句:我本来希望调用SuperClass.foo(),因为正如我所说,使用“未就绪”对象没有任何意义。
另一方面:正如我所想。这对我来说也没有任何意义,当我在 SuperClass 的 c´tor 中时,DerivedClass.foo() 被调用了!
在我的情况下,我该如何称呼SuperClass.foo()?
【问题讨论】:
标签: java oop inheritance