2

我想了解 java 中的对象是如何在内部表示的,由指向字段和函数的“指针”组成 vtables 以及在进行分配、隐式转换和显式转换时这些内部表示如何变化,以及静态和动态类型如何变化检查工作。

考虑一个扩展自: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()

我一直在寻找有关这些主题的资源,但没有找到任何好的资源。如果这个主题太宽泛,如果我能得到一个可以研究这个的方向,那将是有帮助的。

4

0 回答 0