我对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”。
答案 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();
请注意,此处有无实例,但这些是类方法。