-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();
}

is:「現在のインスタンスのメソッドを呼び出しますf()。現在のインスタンスがタイプの場合、これは関数呼び出します。BarBar.f()

これは関数には適用されませんstatic(ただし、循環依存関係のためにコンパイルの問題が発生する可能性があります)。

メソッドを作成するstaticと、3 番目のクラスが実際に呼び出すことができます。

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 に答える