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()会产生输出:
[BaseClass] executionAB()
[SubClass] executionA()
[BaseClass] executionB()
我的问题是:
BaseClass如何从SubClass了解excuteA()方法,同时t.executeC()调用是not possible,因为BaseClass不知道executeC()。
答案 0 :(得分:2)
你对继承中应该做的事情有误解。 extends
是一个明智选择的保留词。 B扩展A的点是B表示具有附加属性的A的子集。你不应该在B中重新定义x; A应该处理x。你应该没有在两个类中声明className
。
至于你的例子:
BaseClass t = new SubClass();
调用SubClass
的构造函数,将className
的{{1}}设置为SubClass
。还会调用超级构造函数,[SubClass]
中的className
设置为BaseClass
。
[BaseClass]
打印 t.executeAB();
的{{1}}的className,然后调用:
BaseClass
[BaseClass]
是来自 executeA();
executeB();
的,因为t是executeA()
且已定义,所以我们得到SubClass
,最后,SubClass
从[SubClass]
所以我们再次executeB()
。至于为什么你不能打电话:
BaseClass
尽管使用[BaseClass]
的构造函数,但t.executeC()
是SubClass
。根据OOP的原则,您无法调用t
,因为它没有为BaseClass
定义。
答案 1 :(得分:0)
您将变量定义为BaseClass t = new SubClass();
,这意味着您允许不同子类的空间进行实例化。但是,为了在不破坏现有代码的情况下实现这一点,您只能使用在基类中定义的方法。