搜索
当前位置: sk彩票 > 对象引用 >

Java多态性详解——父类引用子类对象(2)

gecimao 发表于 2019-06-06 07:54 | 查看: | 回复:

  SUN目前的JVM实现机制,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:

  一个指针指向一张表格,实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型);

  自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass;

  子类的。在运行时期,将根据a这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。

  在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。

  在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行。

  3、记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。

  你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。

  其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个方法在父类中并没有定义,则会出错。

  例如,DerivedC类在继承BaseClass中定义的函数外,还增加了几个函数(例如 myFun())

  当你使用父类引用指向子类的时候,其实jvm已经使用了编译器产生的类型信息调整转换了。

  这里你可以这样理解,相当于把不是父类中含有的函数从虚拟函数表中设置为不可见的。注意有可能虚拟函数表中有些函数地址由于在子类中已经被改写了,所以对象虚拟函数表中虚拟函数项目地址已经被设置为子类中完成的方法体的地址了。

  只是c++中编译器很多是把类型信息和虚拟函数信息都放在一个虚拟函数表中,但是利用某种技术来区别。

  Java把类型信息和函数信息分开放。Java中在继承以后,子类会重新设置自己的虚拟函数表,这个虚拟函数表中的项目有由两部分组成。从父类继承的虚拟函数和子类自己的虚拟函数。

  这样我等于实例化了一个Man的对象,并声明了一个Human的引用,让它去指向Man这个对象

  比如去动物园,你看见了一个动物,不知道它是什么, 这是什么动物? 这是大熊猫!

  这2句话,就是最好的证明,因为不知道它是大熊猫,但知道它的父类是动物,所以,

  如果在子类 Man下你 写了一些它独有的方法 比如 eat(),而Human没有这个方法,

本文链接:http://moodyjews.net/duixiangyinyong/518.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部