我想了解java中的一个对象是如何在内部表示的,包括"指针"到vtables中的字段和函数,以及当有赋值,隐式强制转换和显式强制转换以及静态和动态类型检查如何工作时这些内部表示如何变化。
考虑从Dynamic Method Dispatch in 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()
我已经找到了有关这些主题的消息来源,但还没找到任何好的消息。如果主题过于宽泛,那么如果我可以指明我可以学习的方向,那将会很有帮助。