2

Javaでのメソッドディスパッチと混同しています。最初のメソッド「a.m1(b)」がクラス A を呼び出すのはなぜですか?

呼び出し変数は a です。ランタイム型は B ですね。

class A {
    public void m1(A a){
        System.out.println("A-m1");
    }
    public void m1(){
        System.out.println("A-m1");
    }

}
class B extends A {
    public void m1( B b){
        System.out.println("B-m1");

    }
    public void m1(){
        System.out.println("B-m1");

    }

}
public class HelloWorld {
    public static void main(String[] args) {

    B b = new B();  
    A a = new B();

        a.m1(b);//prints A-m1
        a.m1();//prints B-m1

    }

}
4

1 に答える 1

7

オーバーロードの解決は、コンパイル時の型に基づいて行われます。タイプの変数は、メソッドとAのみを公開します。パラメータを渡すため、呼び出されます。というか、その適切なオーバーライド。のオーバーライドではないことを除いて。(頭の中で、オーバーライドが引数のシグネチャを広げることができるかどうかはわかりませんが、確かにそれらを狭くすることはできません。)m1()m1(A)m1(A)m1(B)m1(A)

于 2013-02-14T18:01:56.920 に答える