多态的实现(内存分析)

例子

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();这个方法调用,其过程如下
a.f()
在找到C类后先找是否有匹配的f()方法,没有则根据父类型指针向上查找,直到找到相匹配的方法。
a.f

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值