7

ランタイム ポリモーフィズムは、メソッドのオーバーライドで常に発生しますか?それとも、メソッドのオーバーライド中に、サブクラス オブジェクトをスーパー クラス変数に割り当てた後にメソッドが呼び出された場合にのみ発生しますか?

class A {
    public void myFunc() {
        System.out.println("Something");
    }
}

class B extends A {
    public void myFunc() {
        System.out.println("Something else");
    }

    public static void main (String args[]) {
        A obj = new B();
        obj.myFunc(); //Is only this call resolved at run time?
     
        A obj2 = new A();
        obj2.myFunc(); //Or is this call too resolved at run time?
   
        B obj3 = new B();
        obj3.myFunc(); //Is this call resolved at compile time?
    }
}
4

5 に答える 5

6

メソッドのオーバーライドでは、メソッドの解決は、RUN TIME OBJECT に基づいて常に JVM によって処理されます。はい、これらの呼び出しはすべて実行時に解決されます。

A obj = new B();
obj.myFunc();
  • ここで、参照変数はクラス A ですが、オブジェクトはクラス B です。したがって、クラス B の myFunc メソッドが呼び出されます。

A obj2 = new A();

obj2.myFunc();

  • ここで、参照変数はクラス A であり、オブジェクトもクラス A です。したがって、クラス A の myFunc メソッドが呼び出されます。

B obj3 = new B();

obj3.myFunc();

  • ここで、参照変数はクラス B であり、オブジェクトもクラス B です。したがって、クラス B の myFunc メソッドが呼び出されます
于 2020-09-14T04:34:15.523 に答える
0

ポリモーフィズムはオブジェクト指向プログラミングの原則です: 実装を気にせずにソフトウェアのロジックを記述します 実行されるコードの正しい実装は (少なくとも原則として) 常に実行時に決定されます

あなたの疑問はこの例についてです:A a = new A(); しかし、それはこれと同等ですA a = MyFactory.get();

final A a = new B();おそらく、JVM は適切な実装の検索を避けるために最適化を実行しますか?

于 2020-09-18T15:00:08.877 に答える