0
package main;

class F {
    void f() {
        System.out.print("F.f() ");
        this.g();
    }

    void g() {
        System.out.print("F.g() ");
    }
}

class Fbis extends F {
    void f() {
        System.out.print("Fbis.f() ");
        this.g();
    }

    void g() {
        System.out.print("Fbis.g() ");
        super.f();
    }
}

public class Main {
    public static void main(String[] args) {
        F f = new Fbis();
        ((F) f).f();
    }
}

こんにちは、F クラスの g() 関数が呼び出されない理由を理解しようとしています。このコードはコンパイルおよび実行されますが、これを示す無限ループにつながります。

Fbis.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() ...

つまり、Fbis.fが呼び出され、 が呼び出され、 が呼び出され、 が呼び出され、Fbis.gF.f呼び出さF.gF.fますFbis.g

4

6 に答える 6

9

基本的に、それが継承の仕組みです。クラスはメソッドをFbisオーバーライドするg()ため、Fbis呼び出しのインスタンスは、クラス自体から呼び出された場合でもg()、クラスからコードを実行します。FbisF

これは通常、望ましい動作です。たとえば、delete()メソッドを想像してみてください。親クラスでは、オブジェクトがアプリケーションによって削除されたときに、これによってクリーンアップが行われます。子クラスでは、この子に固有の追加のクリーンアップを実行します。delete()親クラス内からの場合でも、呼び出されるたびに追加のクリーンアップを実行する必要があります。

于 2012-10-24T12:57:52.033 に答える
0
class F {
    void f() {
        System.out.print("F.f() ");
        this.g(); //<----- This line calls Fbis.g() not F.g() 
                  // because this is the instance of Fbis
    }
于 2012-10-24T13:24:05.527 に答える
0

Ff ですが、Fg を呼び出す代わりに、Ff は Fbis.g を呼び出します。

あなたのコードは言う

void f(){System.out.print("F.f() ");this.g();}

これは、このクラスが実装するクラスをF.f()呼び出す必要があることを意味します。g();

Fbis.g が Fg を呼び出すようにしたい場合は、次のように記述します。

void g(){System.out.print("Fbis.g() "); super.g();}
于 2012-10-24T12:59:08.180 に答える
0

メソッドをオーバーライドすると、どこから呼び出しても、オーバーライドされたバージョンが常に使用されます。

this.g()基本クラスで実行し、現在のオブジェクトがサブクラスに属している場合は、サブクラスで呼び出しますg()

基本クラスから呼び出される基本クラスにメソッドがあり、それらを派生クラスに置き換えることを許可したくない場合は、そのメソッドをプライベートかつ最終的なものにする必要があります。

于 2012-10-24T12:59:20.627 に答える
0

あなたのFbisクラスはメソッドをオーバーライドしますg()Fbis名前が付けられた唯一のメソッドの新しいオブジェクトを作成する場合gは、 で定義されたものFbisです。継承されたメソッドから呼び出しても、それはまだ唯一のものです。そうでなければ、そのオブジェクトを指すFbisオブジェクトを作成する場合、またそれがスーパークラスで使用される場合もそうです。this

于 2012-10-24T13:00:16.150 に答える
0

メソッド Fg() は Fbis にはもう存在しません!

Fbis でメソッド g() を「オーバーライド」しているためです。「super.g」を使用するだけでオーバーライドが保持されることを理解してください。

于 2012-10-24T13:01:08.617 に答える