2017-07-14 18 views
-5
class Y{ 
    void process(){ 
     System.out.println("In Y process()"); 
    } 
} 

class I extends Y{ 
    void process(){ 
     System.out.println("In I process()"); 
    } 

    public static void main(String[] args){ 
     Y y = new I(); 
     y.process(); 
    } 
} 

このコードはJavaのオーバーライドに基づいていますが、この問題に関する疑問があります.y参照変数を使用してプロセスメソッドを呼び出すと、実行時に解決されたメソッド呼び出しか、コンパイラによって解決されますか? JVMがどのプロセスメソッドを呼び出すか、それともコンパイラかを問わず、答えを出す理由を挙げてください。Javaでのオーバーライド:メソッド呼び出しの解決方法

+4

投稿時にコードをフォーマットする時間を取ってください。インデントなしで読むのはとても難しいです。さらに、このトピックは複数回にわたってカバーされており、少なくとも*いくつかのテストアプリケーションの出力だけで答えることができます。 –

+0

[スーパークラスのオーバーライドされたメソッドを呼び出す方法](https://stackoverflow.com/questions/15668032/how-to-call-the-overridden-method-of-a-superclass)の可能な複製 – Blasanka

+0

試しましたか?コードを実行していますか? – Li357

答えて

0

このメソッドは実行時に解決されるため、クラスを拡張しているため、このクラスは親クラスと同じメソッドを持つことができますが、実行時に参照が解決されます。

0

これはランタイムポリモーフィズムと呼ばれます。クラスIのメソッドが実行されます。実行時にオブジェクトの参照型が常にチェックされます。親クラスには処理メソッドが存在しません。オーバーライドするとエラーが発生します。

0

この呼び出しは実行時に解決されます。そして、私のクラスのprocess()メソッドはexucutedになります。スーパークラス参照は子クラスオブジェクトを参照しています。したがって、子クラスオブジェクトを参照しているスーパークラス参照を使用してメソッドを呼び出すと、常に子クラスメソッドが実行されます。