Java のオブジェクトがフィールドおよび vtable の関数への「ポインタ」で構成される内部表現方法と、代入、暗黙的キャストおよび明示的キャストが行われたときにこれらの内部表現がどのように変化するか、および静的型と動的型がどのように変化するかを理解したいと思います。チェックは動作します。
以下から拡張された例を考えてみましょう: Java での動的メソッド ディスパッチ
class A{
int a=10;
public void show(){
System.out.println("Show A: "+a);
}
}
class B extends A{
public int b=20;
public void show(){
System.out.println("Show B: "+b);
}
}
class C extends B{
public int c=30;
public void show(){
System.out.println("Show B: "+c);
}
}
オブジェクトはメモリ内でどのように構築されますか? 割り当て (または同等のパラメーターが渡される) があるとどうなりますか? 次の場合のオブジェクトのメモリ表現の違いは何ですか?
B bObj = new B();
A aObj = new B();
C cObj = new B();
明示的なアップ/ダウン キャストがある場合、メモリ表現はどうなりますか? そのようなキャストが許可されているかどうかをどのように確認し、内部表現とメソッド呼び出しのディスパッチ情報をどのように変更しますか。
((A) new A()).show()
((A) new B()).show()
((A) new C()).show()
((B) new A()).show()
((B) new B()).show()
((B) new C()).show()
((B) new A()).show()
((B) new B()).show()
((B) new C()).show()
((A) xObj).show() //xObj being say an unknown object
((B) xObj).show()
((C) xObj).show()
((C) ((A) new B())).show()
これらのトピックに関するソースを探しましたが、適切なものは見つかりませんでした。トピックが広すぎる場合は、これをどこで勉強できるかについての指示があれば助かります。