例子
class A{
public void f(){...}
}
class B extends A{
}
Class C extends B{
}
A a = new C();
//创建了一个A类型的指针变量指向C类型对象。这里也表明指针类型与比变量类型不一定相同,这种现象称为指针泛化。
a.f();//调用f方法,那么a调用的到底是A类的方法还是B类中的方法?
在java中,一个对象中总是包含一个字段,这个字段里存储着一个指针,指针指向该类对应的类型信息对象。
例如,上面的代码中有,每一个类对应唯一的类型信息对象
无论一个类是否实例化,它的类型信息对象永远只有一个,存储着类相关信息
现在分析下上面的例子中的指针指向关系。
A a = new C(); 创建了一个A类型的指针变量a指向C类型的对象,在C类型对象中存在一个类型信息指针只想C类对应的类型信息对象。
其实,由于继承关系,C类的类型信息对象中包含着一个父类型星系指针指向B类的类型信息对象,同理B类的类型信息对象中包含着一个父类型信息指针指向A类的类型信息对象,A类的类型信息对象中则包含Object类的类型信息对象,而Object类没有父类,所以不存在这个父类型信息指针。
对于a.f();这个方法调用,其过程如下
在找到C类后先找是否有匹配的f()方法,没有则根据父类型指针向上查找,直到找到相匹配的方法。