-3

我有一个关于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”时。

4

3 回答 3

3

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

new Bar().g();

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

覆盖超类中调用的方法是扩展类功能的好方法,您知道类应该总是做某事,但细节因子类而异。将超类方法抽象化是很常见的,因此子类必须实现它,但如果有合理的默认值,您可以将其添加到超类中。

于 2013-05-23T16:49:38.010 回答
1

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

这意味着代码

public void g() {
    f();
}

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

这不适用于static函数(除非您可能会因为循环依赖而遇到编译问题)。

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

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

请注意,这里没有实例,但这些是类方法。

于 2013-05-23T16:59:24.780 回答
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
于 2013-05-23T16:52:43.307 回答