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

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

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

(0)
上一篇 2021年9月15日 下午4:00
下一篇 2021年9月15日 下午5:00


相关推荐

  • javah详解[通俗易懂]

    javah详解[通俗易懂]java开发中如果使用到JNI,则难免需要使用javah来生成C++或C的头文件信息,下面就讲解javah的命令:第一种:直接cd到当前程序的target/class目录下(一定不能是子目录)(maven项目,如果是普通项目则到bin目录下)。然后使用:javahcom.yongcheng.liuyang.utils.TestJni,其中javah后面的是需要生成头文件类的全路径(包名+类名),当然生成的.h文件位于当前class的目录下。第二种:直接在运行中cmd到dos窗口,使用如下命令:j

    2026年3月11日
    4
  • Postman安装教程_postman需要联网吗

    Postman安装教程_postman需要联网吗1.官网安装(别看)打开官网,https://www.getpostman.com安装很麻烦还很容易安装失败(先请擦掉眼泪,不要忧伤,我们依然可以好好的)2.非官网安装这是一种直接通过打包已经安装的扩展程序的方式,来进行我认为的「非法安装」,但没办法,只能这样。我会给你一个安装包,见附件。你应该下载下来,解压缩到你喜欢的位置。(解压的位置自己要记得)安装包(Postman4.1.2下载地址:http://files.cnblogs.com/files/mafly/postman-4

    2025年12月16日
    7
  • tabnine 激活码【注册码】

    tabnine 激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    46
  • delphi多线程访问公共变量

    delphi多线程访问公共变量br 一 用 TCriticalSec 类来阻塞 ps 这里的咚咚都涉及 Win32 编程 我对这些不了解 先掌握如何运用吧 这个有点类似临界区 要 UsesSyncObjs 单元 br 1 声明一个全局的 TCriticalSec 类的实例 br 2 建立 TCriticalSec Create 最好是在程序 onCreate 里面 这样才能保证对所有线程进行控制 br 3 在全局变量访问前用 TCriticalSec Acquire 或 TCriticalSec

    2026年3月18日
    2
  • Nuvo-7160GC工控机安装ubuntu18.04

    Nuvo-7160GC工控机安装ubuntu18.041 使用 rufus 制作 U 盘启动盘一般可以成功 我开始没有成功制作 在安装 ubuntu18 04 时 会报 Ubi languagefail 但重新换了一个好一点的 U 盘 就制作成功了 2 工控机启动按 F2 进入 bios 模式 bios 设置如下 3 将 u 盘启动盘插入 并按 F10 保存并重启 进入 tryubuntuwit 从桌面 installubunt 安装 4 几个主要的步骤过程中的选项 5 在 uefi 模式下的分区

    2026年3月16日
    2
  • Spring集成ESAPI

    Spring集成ESAPIESAPI 是 owasp 提供的一套 API 级别的 web 应用解决方案 简单的说 ESAPI 就是为了编写出更加安全的代码而设计出来的一些 API 方便使用者调用 从而方便的编写安全的代码其官方网站为 https www owasp org 其有很多针对不同语言的版本 其 J2ee 的版本需要 jre1 5 及以上支持安装篇第一步 引入 JarMaven dependency dependency

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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