Java 基类如何知道子类方法?
在上述情况下,调用t.executeAB()将导致输出: [BaseClass]executingAB() [子类]executingA() [BaseClass]executingB() 我的问题是:Java 基类如何知道子类方法?,java,oop,inheritance,overriding,Java,Oop,Inheritance,Overriding,在上述情况下,调用t.executeAB()将导致输出: [BaseClass]executingAB() [子类]executingA() [BaseClass]executingB() 我的问题是: 基类是如何从子类知道excuteA()方法的,同时t.executeC()调用是因为基类不知道executeC()。您对继承中应该做什么有误解扩展是一个明智选择的保留字。B扩展A的目的是说B是A的一个子集,具有附加属性。你不应该在B中重新定义x;A应该在处理x。您不应该在这两个类中声明class
基类是如何从子类知道excuteA()方法的,同时t.executeC()调用是因为基类不知道executeC()。您对继承中应该做什么有误解<代码>扩展是一个明智选择的保留字。B扩展A的目的是说B是A的一个子集,具有附加属性。你不应该在B中重新定义x;A应该在处理x。您不应该在这两个类中声明
className
至于你的例子:
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();
}
}
调用子类
的构造函数,该构造函数将子类
的类名
设置为[SubClass]
。超级构造函数也被调用,BaseClass
中的className
被设置为[BaseClass]
BaseClass t = new SubClass();
打印BaseClass
的类名,即[BaseClass]
,然后调用:
t.executeAB();
executeA()
是从子类
调用的,因为t是一个子类
并且它是被定义的,所以我们得到[子类]
,最后,executeB()
是从基类
调用的,所以我们再次得到[基类]
。至于你为什么不能打电话:
executeA();
executeB();
尽管使用了
子类的构造函数
,t
是基类
。根据OOP的原理,不能调用t.executeC()
,因为它不是为基类定义的 将变量定义为BaseClass t=new SubClass()代码>这意味着您可以为不同的子类提供实例化空间。但是,为了在不破坏现有代码的情况下实现这一点,您只能使用在基类中定义的方法。答案是基类不知道如何或是否重写方法,OOP的神奇之处在于它不必知道。所有这些都是通过方法表在后台处理的。这是在OOPs word中具有继承性的基本原因之一。谢谢steve。您提到“不应该在B中重新定义x”,那么重写有什么用呢?你是说我应该重写executeAB()吗?用于在子类中重新定义方法。例如,重写toString()
是有意义的,因为我们希望能够拥有对象的String
表示(可能需要不同于父对象的toString()
)。我不确定您的意图是什么,但是您永远无法在基类
上调用executeC()
,除非它是在基类
或它的一个超类中定义的……而且,既然您是新手,您应该查看。
t.executeC()