java - 基类如何知道子类方法?

标签 java oop inheritance overriding

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的构造函数,将SubClassclassName设置为[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/

相关文章:

java - 如果是父实例,instanceof 是否返回 true?

C#类继承 hell

java - 如何计算来自相机(openCV)的2个传入帧之间的差异

java - 动态设置图像在旋转时丢失

java - jsp中页面加载时的get方法

python - python 中的属性错误。对象没有属性

java - 在 Java 中打印 HashMap

c# - 适当使用静态方法

java - Spring数据JPA + Hibernate : How do I use a repository on abstract super class for object retrieval?

Java - 从接受泛型的类继承?