2017-01-10 7 views
0

Javaのメソッド呼び出しに関する問題を解決しようとしていますが、これは本当に奇妙なものです。誰かが助けてくれることを願っています。ここ それは三つのクラスのコードであり、Aは、Cは、Aから継承し、I手段Iは、6を得るINT、を有するBオブジェクトのメソッドを呼び出すとDがC.クラス階層のメソッド呼び出しの演習

class A { 
    int f(double x) { 
     return 1; 
    } 

    int f(boolean x) { 
     return 2; 
    } 
} 

class C extends A { 
    int f(double x) { 
     return 3; 
    } 

    int f(int x) { 
     return 4; 
    } 
} 

class D extends C { 
    int f(double x) { 
     return 5; 
    } 

    int f(int x) { 
     return 6; 
    } 

} 

public class test { 
    public static void main(String[] args) { 
     C b = new D(); 
     A d = new D(); 

     System.out.println(b.f(33)); 
     System.out.println(d.f(33)); 
    } 
} 

継承とトップクラスでありますクラスDのメソッドf(int x)が呼び出されたことを示します。しかし、私がオブジェクトdに対して同じメソッドを呼び出すと、5が得られます。つまり、クラスDからのメソッドf(double x)が呼び出されます。それはなぜそれのように振る舞うのですか?なぜ整数は1つのケースでは整数、もう1つのケースでは2倍と見なされますか?それは私が2つのオブジェクトをどのように宣言したかに関係するものですが、私はそれを得ることができません。

答えて

1

違いはオブジェクトの種類にあります。 bの参照はタイプCであり、dの参照はタイプAです。継承の場合、JVMは実行時にメソッドをバインドします。つまり、参照型のメソッドのみを呼び出すことができますが、オーバーライドされたメソッドは実行されるメソッドです。

あなたはd上の関数を呼び出すときAint引数には、対応するメソッドを持っていないため、JVMが自動的にdoubleにキャストします。オブジェクトはDのインスタンスなので、Dにトリクルされますが、それでもdoubleとしてトリックダウンします。

関連する問題