Java超类引用子类对象的规律

Java超类引用子类对象的规律

首先,对于JVM实现引用的一个机制是:类实例的引用就是指向一个句柄(handle)的指针,这个句柄就是一堆指针:一个指针指向一块从java堆中为分配出来内存空间;另一个指针指向一张表(实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型))

 下面举例进行分析:  Student st=new Student();//Student为子类

Person p=st;//Person 为超类

p.sayHello();//该方法在超类和子类中都存在

分析: * 为什么子类的类型的对象实例可以覆给超类引用? 自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型Person;  *p.sayHello()将执行子类还是父类定义的方法? 子类的。在运行时期,将根据p这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个超类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。 特别注意的是: 在p=st的时候,仍然是存在两个句柄,p和st,但是p和st拥有同一块数据内存块和不同的函数表。  动态链接:当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。总结它为:

  一、使用超类型的引用指向子类的对象;    

 二、该引用只能调用超类中定义的方法和变量;

 三、如果子类中重写了超类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)  

  四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了基类中的变量,那么在编译时会报错。  通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。  java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。  1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。  2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

转载于:https://www.cnblogs.com/8888f/p/5548134.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108991.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • imb服务器怎么拆硬盘,IBM P750更换本地硬盘

    imb服务器怎么拆硬盘,IBM P750更换本地硬盘1、确认故障主机报警和硬盘ERPES01@/>errpt-dH|moreIDENTIFIERTIMESTAMPTCRESOURCE_NAMEDESCRIPTION80D3764C0301180416UHLVDDPVNOLONGERRELOCATINGNEWBADBLOCKSE86653C30301180416PH…

  • 5G网络注册中的切片选择「建议收藏」

    5G网络注册中的切片选择「建议收藏」UE->gNB开机以后,UE会发送RequestedNSSAI注册申请,会带有请求的切片ID,即这次的注册我想请求哪些切片ID,发送给基站,gNB->InitialAMF基站RequestedNSSAI注册申请,基站会根据之前的(),去选择一个AMF,初始AMFInitaialAMF可以看到手机带上来的切片ID到底是什么(例如1号),3.InitialAMF<–>UDM同时InitaialAMF会拿手机UE的IMSI信息,在5G里面是SUPI

  • 【python】错误SyntaxError: invalid syntax的解决方法总结

    【python】错误SyntaxError: invalid syntax的解决方法总结今天学习了python,然而刚开始就出了一个难题,明明代码没有一点问题,可是每次运行都会显示“SyntaxError:invalidsyntax”。“SyntaxError:invalidsyntax”的意思就是语法错误;经过查询解决了这个问题,所以总结一个这个问题的解决方法:版本问题:因为python2和python3是不兼容的;可以尝试更换版本;粗心问题:忘…

  • PHP常用的开发工具_小程序开发工具有哪些

    PHP常用的开发工具_小程序开发工具有哪些互联网的流行使得,软件程序发的需求也越来越大,其中PHP程序开发就是一个先例。PHP是英文超级文本预处理语言HypertextPreprocessor的缩写。PHP是一种HTML内嵌式的语言,

  • 查看linux内核版本号的方法_查看系统型号命令

    查看linux内核版本号的方法_查看系统型号命令小编给大家分享一下关于查看Linux系统版本、内核版本、查看Linux的IP地址以及Terminal终端最常用到的几个命令符:一、查看Linux系统版本(cat/etc/issue或者lsb_release-a)二、查看Linux内核版本命令(cat/proc/version或者uname-a)三、查看Linux的IP地址:四、常用命令:1、tab键命令补全2、cle…

    2022年10月10日
  • 配置pycharm下的tensorflow环境

    配置pycharm下的tensorflow环境PyCharm就是Python语言开发中一个很受欢迎的IDE,界面类似于visualstudio,androidstudio,集成的功能也很多。集成开发环境(IDE,IntegratedDevelopmentEnvironment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。1.首先确保安装好了tensorflow,链接:htt…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号