在父类中调用覆盖函数

时间:2013-05-23 16:45:26

标签: java oop inheritance

我对java继承有一点疑问。所以说我有以下课程。

class ScreenObject {
    public void update(GameContainer gc, StateBasedGame sbg, int delta) {
        Input input = gc.getInput();
        int mouseX = input.getMouseX();
        int mouseY = input.getMouseY();
        boolean mouseClick = input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON);
        if (detectMouseClick(mouseX, mouseY, mouseClick)) {
        this.performClick(gc,sbg,delta);
        }
    }


    public void performClick(GameContainer gc, StateBasedGame sbg, int delta) {
    }
}

class CrewMember extends ScreenObject {
public void update(GameContainer gc, StateBasedGame sbg, int delta) {
    super.update(gc, sbg, delta);
    }

    public void performClick(GameContainer gc, StateBasedGame sbg, int delta) {
        System.out.println("hi");
    }
}

现在当使用正确的参数调用crewMember.update()时,没有输出,应该有“hi”。

3 个答案:

答案 0 :(得分:3)

如果你有一个Bar,那么当你在它上面调用f()时,即使你从Foo代码调用它,你也会得到Bar的f。没有选择,如果它被覆盖你得到被覆盖的那个,所以调用

new Bar().g();

将导致“再见”写入控制台。

在超类中调用的重写方法是扩展类功能的好方法,你知道类应该总是做一些事情,但细节因子类而异。创建一个超类方法是很常见的,所以子类必须实现它,但是如果有一个合理的默认值,你可以将它添加到超类中。

答案 1 :(得分:1)

只需添加一个示例来帮助OP了解@Nathan Hughes的描述:

Foo one = new Foo();
one.f(); // Foo.f() is called

Foo two = new Bar();
two.f(); // Bar.f() is called

Bar three = new Bar();
three.f(); // Bar.f() is called

答案 2 :(得分:1)

在Java中,所有非静态方法都是“虚拟”。这意味着对f()的任何调用都将使用当前实例的重写版本。您可以使用super.f();调用超类方法,但不能将 down 调用到子类中。

这意味着代码

public void g() {
    f();
}

是:“调用当前实例的方法f() 。如果当前实例的类型为Bar,则此调用函数Bar.f()

这不适用于static函数(除了由于循环依赖性而可能会遇到编译问题)。

如果你制作方法static,第三类实际上可以调用:

Foo.f();
Bar.f();

请注意,此处有无实例,但这些是类方法。