2016-09-26 4 views
0

私は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にアップキャストされているので、どのようにして実際の型を取得できるのでしょうか?

+0

Javaで多態的メソッドを呼び出すときに*キャストが発生しません。実行時のポリモーフィズムは正確にどのように動作するのですか?ランタイムは現在の型に関連付けられた 'ディスパッチテーブル'を参照します(Javaでは各オブジェクトインスタンスに型情報が格納されます)[[Object#getClass() '](https:// docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--)たとえば、メソッド呼び出しが発行された。 – user2864740

答えて

1

Javaは各オブジェクトに仮想メソッドテーブル(AKAディスパッチテーブル)を保持しているため、実行時に呼び出されるときに実際に呼び出されるのはfです。それはまた、彼らがいない実際の意味でのキャストまで、あなたが考えているんなど

注...のインスタンスであるかのようにクラスのオブジェクトについての関連メタっぽい情報を追跡します

。ランタイムは、最小限の量の安全性/型チェックを行いますが、それ以外では仮想メソッドテーブルを使用して、呼び出されたときに実行するメソッドをルックアップします。

関連する問題