2
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] 执行 AB()

[子类] 执行A()

[BaseClass] 执行 B()

我的问题是:

BaseClass 如何知道 SubClass 的 excuteA() 方法,同时由于 BaseClass 不知道 executeC( ) 调用 t.executeC() 是不可能的。

4

2 回答 2

2

您对继承时应该做什么有误解。extends是明智选择的保留字。B 扩展 A 的意义在于 B 是具有附加属性的 A 的子集。您不应该在 B 中重新定义 x;A 应该处理 x。你不应该className在两个类中声明。

至于你的例子:

 BaseClass t = new SubClass(); 

调用构造函数 for SubClass,其中设置className为。超级构造器也被调用,并且in设置为。SubClass[SubClass]classNameBaseClass[BaseClass]

 t.executeAB();

打印BaseClassis 的类名[BaseClass],然后调用:

 executeA(); 
 executeB();

executeA()是 a 调用 from SubClass,因为 t 是 aSubClass并且它是定义的,所以我们得到[SubClass],最后,再次executeB()从 so 调用BaseClass,我们得到[BaseClass]。至于为什么不能打电话:

t.executeC()

尽管使用构造函数 for SubClass, tis a BaseClass. 根据 OOP 的原则,你不能调用 是有道理的t.executeC(),因为它没有定义为BaseClass.

于 2013-06-17T00:59:47.883 回答
0

您将变量定义为BaseClass t = new SubClass();,这意味着您为不同的子类实例化留出了空间。但是,为了在不破坏现有代码的情况下实现这一点,您只能使用基类中定义的方法。

于 2013-06-17T01:01:45.053 回答