私はJavaで多形性の概念を学んでいるときに質問が発生します。次のコードに示すように:javaはオブジェクトの実際のタイプをどのように決定するのですか?
public class test {
public static void main(String[] args){
testF(new B());
}
public static void testF(A a){
a.f();
}
}
class A{
public void f(){System.out.println("method in super class");}
}
class B extends A{
public void f(){System.out.println("mehtod in sub class");}
}
testFメソッドはクラスのパラメータを必要とするが、我々は、クラスのサブクラスであるクラスBの参照を渡します。コンパイルはそれを受け入れるのがうれしいですし、多態性のメカニズムのため、リファレンス 'a'でメソッドf()を呼び出すと、「実際の型」で宣言されたメソッドが取得されます。私の質問は、新しいビルドオブジェクトBをtestF()に渡すとクラスAにアップキャストされているので、どのようにして実際の型を取得できるのでしょうか?
Javaで多態的メソッドを呼び出すときに*キャストが発生しません。実行時のポリモーフィズムは正確にどのように動作するのですか?ランタイムは現在の型に関連付けられた 'ディスパッチテーブル'を参照します(Javaでは各オブジェクトインスタンスに型情報が格納されます)[[Object#getClass() '](https:// docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--)たとえば、メソッド呼び出しが発行された。 – user2864740