如何理解父类引用指向子类对象

如何理解父类引用指向子类对象java 多态 如何理解父类引用指向子类对象要理解多态性 首先要知道什么是 向上转型 我定义了一个子类 Cat 它继承了 Animal 类 那么后者就是前者是父类 我可以通过 Catc newCat 实例化一个 Cat 的对象 这个不难理解 但当我这样定义时 Animala newCat 表示定义了一个 Animal 类型的引用 指向新建的 Ca

java多态,如何理解父类引用指向子类对象

Animal a = new Cat(); 

表示定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。

那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的; 同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。也可以叫做动态绑定。

动态绑定是指”在执行期间(而非编译期间)“判断所引用对象的实际类型,根据实际的类型调用其相应的方法。

看下面这段程序:

class Father { public void func1() { func2(); } 

// 这是父类中的func2()方法,因为下面的子类中重写了该方法 ,所以在父类类型的引用中调用时,这个方法将不再有效,取而代之的是将调用子类中重写的func2()方法

public void func2() { System.out.println("AAA"); } } 
 public void func1(int i) { System.out.println("BBB"); } // func2()重写了父类Father中的func2()方法 如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法 public void func2() { System.out.println("CCC"); } } public class PolymorphismTest { public static void main(String[] args) { Father child = new Child(); child.func1();// 打印结果将会是什么? } } 

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

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

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

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

多态的3个必要条件:

1.继承 2.重写 3.父类引用指向子类对象。

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

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

(0)
上一篇 2026年3月16日 下午6:24
下一篇 2026年3月16日 下午6:25


相关推荐

  • Pycharm 恢复到默认设置

    Pycharm 恢复到默认设置有时候我们想将软件的主题配色、插件等配置初始化,可是会发现卸载并重新安装Pycharm后,软件会默认使用卸载前的个性化设置。解决方案如下:点击Pycharm的“文件”菜单,里面有一个“管理IDE设置”的选项,然后点击“恢复默认设置”。……

    2022年8月28日
    8
  • (十一)模仿学习

    (十一)模仿学习  从之前的讨论看,都是有奖励的。哪怕是上一章的稀疏奖励,其实也有奖励。==假如任何奖励都没有怎么办?==本章介绍的就是这种情况的解决办法。什么时候任何奖励都没有。其实还挺常见的,以聊天机器人为例,聊的好不好很难定义奖励。解决这种情况的方法就是模仿学习  模仿学习(imitationlearning),有时也叫示范学习或者学徒学习。指有一些专家的示范,通过模仿这些专家来达到目的。专家的示范含义很广,比如在自动驾驶中,一个司机的行为就可以被称为专家的示范。  模仿学习中主要有两个方法:行为克隆和逆强化

    2026年1月26日
    4
  • 微信小程序点击按钮弹出弹窗_微信小程序弹窗,微信小程序页面跳转、弹出框…

    微信小程序点击按钮弹出弹窗_微信小程序弹窗,微信小程序页面跳转、弹出框…微信小程序弹窗 微信小程序页面跳转 弹出框浏览量 2396 时间 2019 12 09 来源 Reyon 一 页面跳转页面跳转是微信小程序中使用较为频繁并且很重要的功能之一 页面跳转一般是通过点击按钮或者文本区域后需要进行的操作 页面跳转中需要注意的点很多 我在这就介绍一些我在写项目过程中所遇到的一些情况里的跳转方式 1 一般情况一般情况下 在点击了按钮或文本之后 跳转到另一个页面 wxmlbutt

    2026年3月16日
    3
  • 有符号,无符号数在字节拼接过程中的区别和注意

    有符号,无符号数在字节拼接过程中的区别和注意

    2021年8月14日
    56
  • BeanCopier工具类_BeanUtils

    BeanCopier工具类_BeanUtilscglib的BeanCopier功能很强大,不过频繁的create太占用资源,降低服务器性能,所以写了下面的代码进行优化。以达到提升性能的目的。主要就是用缓存将类型相同的copier缓存起来,后续copy的时候就不用再继续创建了。这样的话如果有频繁用到BeanCopier的地方,将是很有用处滴。importorg.springframework.cglib.beans.BeanCopi…

    2025年9月15日
    9
  • libcurl 教程

    libcurl 教程感谢原作者的辛勤劳作 https blog csdn net JGood article details 目标 nbsp nbsp nbsp 本文档介绍了在应用程序开发过程中 如何正确使用 libcurl 的基本方式和指导原则 文档使用 C 语言来调用 libcurl 的接口 当然也适用于其他与 C 语言接近的语言 nbsp nbsp nbsp 文档主要针对使用 libcurl 来进行开发的人员 文档所掼的应用程序泛指你写的源代

    2026年3月19日
    2

发表回复

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

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