0

次のコードを試しました

public class HelloWorld {

    public void printData(Test t) {
        System.out.println("Reached 1");
    }

    public void printData(newTest t) {
        System.out.println("Reached 2");
    }

    public void printData(newTest1 t) {
        System.out.println("Reached 3");
    }

    public static void main(String args[]) {
        Test t1 = new Test();
        HelloWorld h = new HelloWorld();
        h.printData(t1);

        NewTest t2 = new NewTest();
        h.printData(t2);

        NewTest1 t3 = new NewTest1();
        h.printData(t3);

        Test t4 = new NewTest();
        h.printData(t4);

        Test t5 = new NewTest1();
        h.printData(t5);
    }
}

そして私は簡単なクラスを持っています

class Test {
}

class NewTest extends Test {
}

class NewTest1 extends Test {
}

そして私が得た出力は

Reached 1
Reached 2
Reached 3
Reached 1
Reached 1

出力から、jvm が実行する関数を決定するときに、参照の型のみが考慮され、オブジェクトの実際の型は考慮されないように見えます。

なぜこれが起こるのですか?jvm が実際のオブジェクトを指している参照の型ではなく、実際のオブジェクトの型を考慮できないのはなぜですか?

4

1 に答える 1

3

関数のオーバーロードはコンパイル時のポリモーフィズムであり、ここでコンパイラーはメソッドのどのバージョンが呼び出されるかを決定します。

于 2013-08-16T04:53:04.360 に答える