Java 基类如何知道子类方法?

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

在上述情况下,调用t.executeAB()将导致输出:

[BaseClass]executingAB()

[子类]executingA()

[BaseClass]executingB()

我的问题是:


基类是如何从子类知道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()