public class BaseClass {
private String className;
public BaseClass() {
className = "[BaseClass]";
}
public void executeAB() {
System.out.println(className + " executingAB()");
executeA();
executeB();
}
public void executeA() {
System.out.println(this.className + " executingA()");
}
public void executeB() {
System.out.println(this.className + " executingB()");
}
}
public class SubClass extends BaseClass {
private String className;
public SubClass() {
this.className = "[SubClass]";
}
public void executeA() {
System.out.println(className + " executingA()");
}
public void executeC() {
System.out.println(className + " executingC()");
}
public static void main(String[] args) {
BaseClass t = new SubClass();
t.executeAB();
// t.executeC();
}
}
在上述情况下,调用 t.executeAB() 会产生输出:
[基类]执行AB()
[子类]执行A()
[基类]执行B()
我的问题是:
BaseClass如何知道SubClass的excuteA()方法,同时t.executeC()调用是not possible因为 BaseClass 不知道executeC()。
最佳答案
您对继承中应该做什么有误解。 extends
是一个经过明智选择的保留字。 B 扩展 A 的意义在于 B 是 A 的子集,并且具有附加属性。你不应该在 B 中重新定义 x; A 应该处理 x。您不应该在这两个类中声明 className
。
至于你的例子:
BaseClass t = new SubClass();
调用SubClass
的构造函数,将SubClass
的className
设置为[SubClass]
。 super 构造函数也被调用,BaseClass
中的className
被设置为[BaseClass]
。
t.executeAB();
打印 BaseClass
的类名,即 [BaseClass]
,然后调用:
executeA();
executeB();
executeA()
是从 SubClass
调用的,因为 t 是一个 SubClass
并且它已定义,所以我们得到 [SubClass ]
最后,从 BaseClass
调用 executeB()
,所以我们再次得到 [BaseClass]
。至于为什么不能调用:
t.executeC()
尽管使用了SubClass
的构造函数,t
仍然是一个BaseClass
。根据 OOP 的原则,您不能调用 t.executeC() 是有道理的,因为它不是为 BaseClass
定义的。
关于java - 基类如何知道子类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17139147/