1. ホーム
  2. java

[解決済み] 継承と再帰

2023-04-28 04:38:24

質問

以下のようなクラスがあるとします。

class A {

    void recursive(int i) {
        System.out.println("A.recursive(" + i + ")");
        if (i > 0) {
            recursive(i - 1);
        }
    }

}

class B extends A {

    void recursive(int i) {
        System.out.println("B.recursive(" + i + ")");
        super.recursive(i + 1);
    }

}

では recursive をクラスAで呼び出してみましょう。

public class Demo {

    public static void main(String[] args) {
        A a = new A();
        a.recursive(10);
    }

}

出力は予想通り、10からのカウントダウンです。

A.recursive(10)
A.recursive(9)
A.recursive(8)
A.recursive(7)
A.recursive(6)
A.recursive(5)
A.recursive(4)
A.recursive(3)
A.recursive(2)
A.recursive(1)
A.recursive(0)

では、わかりにくい部分に行きましょう。ここで recursive をクラスBで呼び出します。

期待される :

B.recursive(10)
A.recursive(11)
A.recursive(10)
A.recursive(9)
A.recursive(8)
A.recursive(7)
A.recursive(6)
A.recursive(5)
A.recursive(4)
A.recursive(3)
A.recursive(2)
A.recursive(1)
A.recursive(0)

実際の :

B.recursive(10)
A.recursive(11)
B.recursive(10)
A.recursive(11)
B.recursive(10)
A.recursive(11)
B.recursive(10)
..infinite loop...

これはどのようにして起こるのでしょうか?これは工夫された例であることは分かっていますが、不思議に思ってしまいます。

古い質問で 具体的な使用例 .

どのように解決するのですか?

これは予想されることです。のインスタンスでは、このようなことが起こります。 B .

class A {

    void recursive(int i) { // <-- 3. this gets called
        System.out.println("A.recursive(" + i + ")");
        if (i > 0) {
            recursive(i - 1); // <-- 4. this calls the overriden "recursive" method in class B, going back to 1.
        }
    }

}

class B extends A {

    void recursive(int i) { // <-- 1. this gets called
        System.out.println("B.recursive(" + i + ")");
        super.recursive(i + 1); // <-- 2. this calls the "recursive" method of the parent class
    }

}

このように、呼び出しは交互に AB .

のインスタンスの場合、このようなことは起こりません。 A のインスタンスの場合、オーバーライドされたメソッドは呼び出されないからです。