基类如何知道子类方法?

时间:2013-06-17 00:56:13

标签: java oop inheritance override

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()。

2 个答案:

答案 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();,这意味着您允许不同子类的空间进行实例化。但是,为了在不破坏现有代码的情况下实现这一点,您只能使用在基类中定义的方法。