7.0、Java继承与多态 - 多态的特性

7.0、Java继承与多态 - 多态的特性

面向对象的三大特征:封装性、继承性、多态性;

extends继承 或者 implements实现,是多态性的前提;

        用学生类创建一个对象 - 小明,他是一个 学生(学生形态),但同时也是一个 人(人类形态)

        小明是一个对象;这个对象既有 学生形态 也有 人类形态,一个对象拥有多种形态,这就是对象的多态性

代码中体现多态性,其实就是一句话 -> 父类引用指向子类对象;下面用代码给大家示范一下:

创建 People.java 类,如下所示 ->

public class People {
    int num = 6;
    public void eat() {
        System.out.println("人类吃饭");
    }
}

创建 Students.java 类,并让其继承 People 类,然后重写 eat() 方法,如下所示->

public class Students extends People {
    int num = 9;
    @Override
    public void eat() {
        System.out.println("学生吃饭");
    }
}

创建 Main.java 类,如下所示 ->

public class Main {
    public static void main(String[] args) {
        //使用多态的写法
        //左侧父类的引用,指向了右侧子类的对象
        People people = new Students();
        people.eat();//这里调用成员方法,看等号右边是谁就有先调用谁
        System.out.println(people.num);//这里调用成员变量,看等号左边是谁就有先调用谁,所以输出的是 6
    }
}

        People people = new Students;people.eat(); -> 这里显然会调用 Students 中的 eat() 方法;因为 new 出来的是 Students 对象( 就是调用成员方法时 等号右边是谁就优先调用谁的方法 ); 

        而下面的 System.out.println(people.num);调用的是成员变量,那么看的就是 等号左边 是谁就优先调用谁,显然调用的是 People 中的 num = 6; 

        当我们通过成员方法去访问成员变量时,访问的该成员方法属于哪个类,访问的成员变量就是哪个类的;

在访问 成员方法 的时候有一个口诀:编译看左边,运行看右边 -> 具体情况看下面代码实例:

创建父类 Fu.java 文件,如下所示 ->

public class Fu {
    public void eat() {
        System.out.println("父类吃东西");
    }
    public void fuMethod() {
        System.out.println("执行fuMethod方法");
    }
}

创建 Zi.java 文件,并让其继承 Fu 类,如下所示 ->  

public class Zi extends Fu{
    @Override
    public void eat() {
        System.out.println("子类吃东西");
    }
    public void ziMethod() {
        System.out.println("执行ziMethod方法");
    }
}

创建 Main.java 文件,如下所示 ->

public class Main {
    public static void main(String[] args) {
        Fu fu = new Zi();
        fu.eat();//编译通过在Fu类中有eat()方法但是运行时看右边Zi类,所以执行的是Zi类中的eat()方法
        fu.fuMethod();//编译通过在Fu类中有fuMethod()方法但是运行时看右边Zi类,但是Zi类中没有fuMethod()方法,所以向上找到父类中的fuMethod()方法执行
        fu.ziMethod();//编译不通过,左边是Fu 但是在Fu类中并没有ziMethod()这个方法所以编译不通过
    }
}

fu.eat();
        编译通过在 Fu 类中有 eat() 方法但是运行时看右边 Zi 类,所以执行的是 Zi 类中的 eat() 方法;

fu.fuMethod();
        
编译通过在 Fu 类中有 fuMethod() 方法但是运行时看右边 Zi 类,但是 Zi 类中没有 fuMethod() 方法,所以向上找到父类中的 fuMethod() 方法执行;

fu.ziMethod();
        
编译不通过,左边是 Fu 但是在 Fu 类中并没有 ziMethod() 这个方法所以编译不通过;

注意一下:

        该口诀针对的是 成员方法;不是 成员变量,访问 成员变量 的时候 编译看左边,运行看右边 ] 的口诀不适用;访问成员变量的时候口诀应该变成是 -> 编译看左边,运行还是看左边 ] 

那么多态在代码中的运用到底有什么作用呢?

下面给大家稍作解释 ->

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17090.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

彻底告别手动配置任务,魔改xxl-job!

分析 改造 1、接口调用 2、创建新注解 3、自动注册核心 4、自动装配 测试 测试后 XXL-Job是一款非常优秀的任务调度中间件,其轻量级、使用简单、支持分布式等优点,被广泛应用在我们的项目中,解决了不少定时任务的调度问题。不仅如此&a…

TIM-定时器——STM32

TIM-定时器——STM32 TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包…

Mybatis方式完成CRUD操作

Mybatis方式完成CRUD操作 文章目录 Mybatis方式完成CRUD操作1、java以Mybatis方式操作DB1.1、配置数据源-创建 resources/mybatis-config.xml1.2、创建java bean-Monster1.3、配置Mapper接口声明方法1.4、配置xxMapper,完成SQL配置,实现CRUD操作1.5、Test测试 2、需…

jvm调优策略

jvm调优主要是内存管理方面的调优,包括各个代的大小,GC策略等。 代大小调优 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物…

第三十二章 Unity Mecanim动画系统(上)

在上一章节中,我们介绍了Unity的旧版动画系统,本章节来介绍新版的Mecanim动画系统。新版的Mecanim动画系统实际是对旧版动画系统的升级。新版的Mecanim动画系统仍然是建立在动画片段的基础上的,只不过它给我们提供了一个可视化的窗口来编辑动…

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习

详情点击链接:R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习 Meta分析的选题与文献检索 Meta分析Meta分析的选题策略文献检索数据库精确检索策略,如何检索全、检索准文献的管理与清洗,如何制定文献纳入排除标准文献数据获取技…

搭建网站使用轻量云服务器怎么样?

​  搭建网站实际上可以从轻量云服务器租用中受益匪浅。如果您正在为个人网站寻找更多的低成本和轻运维,您可以考虑将轻量云服务器作为一个可行的选择。它提供独享资源、独立的IP地址、专属防火墙以及比传统虚拟主机更好的安全性能。本文将介绍轻量云服务器对建站…

【操作系统OS】学习笔记:第一章 操作系统基础【哈工大李治军老师】

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记&#xff0c;仅进行交流分享。 特此鸣谢李治军老师&#xff0c;操作系统的神作&#xff01; 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0…

Ubuntu磁盘和目录和文件的相关操作

目录 1、目录的切换 2、查看目录及文件 3、目录的常见操作 4、文件的常见操作 5、查看文件及目录大小 6、命令查看硬盘信息 1、目录的切换 打开终端窗口&#xff08;”ctrlaltt“&#xff09; 一般使用&#xff08;”pwd“&#xff09;显示当前所在的目录 比如&#x…

Flutter学习之旅 -网格布局

GridView列表三种形式 可以通过GridView.count实现网格布局 /* 格式: GridView.count(crossAxisCount: 一行显示数量,children: [component(),...],) */ class MyHomePage extends StatelessWidget {const MyHomePage({Key? key}) : super(key: key);overrideWidget build(B…

C++每日一练:小艺照镜子(详解分治法)

文章目录 前言一、题目二、解题1.分析 总结 前言 大过节的&#xff0c;不想去看人后脑勺&#xff0c;就做点题来玩。挑了小艺照镜子&#xff0c;百分通过~ 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 题目名称&#xff1a; 小艺照镜子 …

【Linux】生产者消费者模型

目录 一、生产者消费者模型 1、生产者消费者模型的概念 2、生产者、消费者之间的关系 3、生产者和消费者的特点 二、基于BlockingQueue的生产者消费者模型&#xff08;条件变量控制同步与互斥&#xff09; 1、一个生产线程和一个消费线程完成的计算任务 1.1BlockQueue.h…

Kubernetes服务搭建[配置-部署](Kubeadm)

文章目录 **[1 — 7] ** [ 配置K8S主从集群前置准备操作 ]一&#xff1a;主节点操作 查看主机域名->编辑域名1.1 编辑HOST 从节点也做相应操作1.2 从节点操作 查看从节点102域名->编辑域名1.3 从节点操作 查看从节点103域名->编辑域名 二&#xff1a;安装自动填充&…

进程地址空间与页表方面知识点(缺页中断及写时拷贝部分原理)

谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 目录 谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 抛出总结 开始介绍 发现问题 进程地址空间&#xff08;虚拟地址&#xff09; 页表 物理内存与进程地址空间映射 缺页中断基本…

Spring--AOP详细介绍--和详细代码演示证明理解

目录 Spring--AOP详细介绍 基本介绍 代码演示—入门 需求说明 定义一个接口类Vehicle 定义一个实现接口类的Car类 定义一个实现接口类的Ship类 创建测试类Test.java 来思考一下&#xff0c; 解决方案-动态代理方式-2 修改 Car类 修改 Ship类 创建VehicleProxyProvid…

Stable Diffusion使用方法

SD的本地安装教程有很多我就不重复了&#xff0c;这里主要是记录我在使用SD Webui的过程中遇到的问题&#xff0c;总结的一些提升出图效率&#xff0c;出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 &#xff1f; Ok&#xff0c;以上只是一小部分成品 &#xff0c;属…

PyQt5桌面应用开发(6):文件对话框

本文目录 PyQt5桌面应用系列介绍QFileDialog的静态接口QFileDialog的对象接口 示例结论后记 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 PyQt5桌面应用开发&#xff…

MRI k空间概念整理

以下内容为MRI期末复习笔记&#xff0c;仅供复习参考使用。 K空间概念 K空间为包含MR数据的阵列&#xff0c;也可定义为原始数据阵列相位编码轴和频率编码轴的交叉点 MR扫描得到的数据为谱空间数据&#xff0c;谱空间数据与空间数据位置无直接对应关系 k空间每一数据点或数据…

不能使用chatGPT?这3个平替甚至比chatGPT更强

不能使用chatGPT&#xff1f;这3个平替甚至比chatGPT更强 chatGPT&#xff0c;一款由OpenAI开发的新型AI聊天机器人&#xff0c;正在势如破竹地改变着许多人的工作和生活方式。作为一款基于大语言模型的聊天机器人&#xff0c;chatGPT能够理解自然语言并进行人机对话。与传统的…

用于scATAC-seq有监督分类的Cellcano

细胞类型识别是单细胞数据分析的基本步骤。由于高质量参考数据集的可用性&#xff0c;有监督细胞分类方法在scRNA-seq数据中很受欢迎。染色质可及性分析&#xff08;scATAC-seq&#xff09;的最新技术进步为理解表观遗传异质性带来了新的见解。随着scATAC-seq数据集的不断积累&…