多态的实现

2023-11-19

多态
之前介绍过多态的概念就是基类引用派生类对象且和派生类有相同的同名覆盖函数,那么现在我们就具体讲讲怎么实现多态。
类方法实现多态性有两种方法:
1.方法重载:可以声明多个同名但参数个数,类型,和顺序不同的方法。编译时根据参数(个数,类型和顺序)判定采用的方法。这种编译时确定的模式又称“静态绑定”。
2.方法重写:派生类声明与从基类继承的方法签名一致的方法,即重写方法。程序运行时根据运行时对象的类型,调用相应类实现(重写)的方法。这种运行时确定的模式,又称为“动态绑定”。
静态绑定和动态绑定
1.静态绑定(invokestatic):所谓静态绑定就是指编译时期的绑定。调用static方法,静态绑定就是函数的调用,在编译时期就确定下来了,不会做任何改变。
2.动态绑定:动态绑定是运行时期的绑定,就是函数调用时,首先根据引用变量,找到堆上的对象,再从对象头的方法表地址找到对应的方法表,再从方法表中取出。
画图理解动态绑定:
在这里插入图片描述
代码理解动态绑定:

 package javastudy.summary;

 class Animal {
 /**
 * 声明一个私有的成员变量name。
 */
     private String name;
     /**
      * 在Animal类自定义的构造方法
      * @param name
      */
     Animal(String name) {
         this.name = name;
     }
 
     /**
      * 在Animal类里面自定义一个方法enjoy
      */
     public void enjoy() {
         System.out.println("动物的叫声……");
     }
 }
 
 /**
  * 子类Cat从父类Animal继承下来,Cat类拥有了Animal类所有的属性和方法。
  * @author gacl
  *
  */
 class Cat extends Animal {
     /**
      * 在子类Cat里面定义自己的私有成员变量
      */
     private String eyesColor;
 
     /**
      * 在子类Cat里面定义Cat类的构造方法
      * @param n
      * @param c
      */
     Cat(String n, String c) {
         /**
          * 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。
          * 把子类对象里面的父类对象先造出来。
          */
         super(n);
         eyesColor = c;
     }
 
     /**
      * 子类Cat对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。
      */
     public void enjoy() {
         System.out.println("我养的猫高兴地叫了一声……");
     }
 }
 
 /**
  * 子类Dog从父类Animal继承下来,Dog类拥有了Animal类所有的属性和方法。
  * @author gacl
  *
  */
 class Dog extends Animal {
     /**
      * 在子类Dog里面定义自己的私有成员变量
      */
     private String furColor;
 
     /**
      * 在子类Dog里面定义Dog类的构造方法
      * @param n
      * @param c
      */
     Dog(String n, String c) {
         /**
          * 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。
          * 把子类对象里面的父类对象先造出来。
          */
         super(n);
         furColor = c;
     }
 
     /**
      * 子类Dog对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。
      */
     public void enjoy() {
         System.out.println("我养的狗高兴地叫了一声……");
     }
 }
 
 /**
  * 子类Bird从父类Animal继承下来,Bird类拥有Animal类所有的属性和方法
  * @author gacl
  *
  */
 class Bird extends Animal {
     /**
      * 在子类Bird里面定义Bird类的构造方法
      */
     Bird() {
         /**
          * 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。
          * 把子类对象里面的父类对象先造出来。
          */
         super("bird");
     }
 
     /**
      * 子类Bird对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。
      */
     public void enjoy() {
         System.out.println("我养的鸟高兴地叫了一声……");
     }
 }
 
 /**
  * 定义一个类Lady(女士)
  * @author gacl
  *
  */
 class Lady {
     /**
      * 定义Lady类的私有成员变量name和pet
      */
     private String name;
     private Animal pet;

     /**
      * 在Lady类里面定义自己的构造方法Lady(),
     * 这个构造方法有两个参数,分别为String类型的name和Animal类型的pet,
     * 这里的第二个参数设置成Animal类型可以给我们的程序带来最大的灵活性,
      * 因为作为养宠物来说,可以养猫,养狗,养鸟,只要是你喜欢的都可以养,
      * 因此把它设置为父类对象的引用最为灵活。
      * 因为这个Animal类型的参数是父类对象的引用类型,因此当我们传参数的时候,
      * 可以把这个父类的子类对象传过去,即传Dog、Cat和Bird等都可以。
      * @param name
      * @param pet
      */
     Lady(String name, Animal pet) {
         this.name = name;
         this.pet = pet;
     }
 
     /**
      * 在Lady类里面自定义一个方法myPetEnjoy()
      * 方法体内是让Lady对象养的宠物自己调用自己的enjoy()方法发出自己的叫声。
      */
     public void myPetEnjoy() {
         pet.enjoy();
     }
 }
 
 public class TestPolymoph {
     public static void main(String args[]) {
        /**
         * 在堆内存里面new了一只蓝猫对象出来,这个蓝猫对象里面包含有一个父类对象Animal。
         */
         Cat c = new Cat("Catname", "blue");
         /**
          * 在堆内存里面new了一只黑狗对象出来,这个黑狗对象里面包含有一个父类对象Animal。
          */
         Dog d = new Dog("Dogname", "black");
         /**
          * 在堆内存里面new了一只小鸟对象出来,这个小鸟对象里面包含有一个父类对象Animal。
          */
         Bird b = new Bird();
 
         /**
          * 在堆内存里面new出来3个小姑娘,名字分别是l1,l2,l3。
          * l1养了一只宠物是c(Cat),l2养了一只宠物是d(Dog),l3养了一只宠物是b(Bird)。
          * 注意:调用Lady类的构造方法时,传递过来的c,d,b是当成Animal来传递的,
          * 因此使用c,d,b这三个引用对象只能访问父类Animal里面的enjoy()方法。
          */
         Lady l1 = new Lady("l1", c);
         Lady l2 = new Lady("l2", d);
         Lady l3 = new Lady("l3", b);
         /**
          * 这三个小姑娘都调用myPetEnjoy()方法使自己养的宠物高兴地叫起来。
          */
         l1.myPetEnjoy();
         l2.myPetEnjoy();
         l3.myPetEnjoy();
     }
 }

运行结果:
在这里插入图片描述

多态的存在有三个必要的条件:

要有继承(两个类之间存在继承关系,子类继承父类)
要有重写(在子类里面重写从父类继承下来的方法)
父类引用指向子类对象

这三个条件一旦满足,当你调用父类里面被重写的方法的时候,实际当中new的是哪个子类对象,就调用子类对象的方法(这个方法是从父类继承下来后重写后的方法)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多态的实现 的相关文章

  • 长篇图解java反射机制及其应用场景

    一 什么是java反射 在java的面向对象编程过程中 通常我们需要先知道一个Class类 然后 new 类名 方式来获取该类的对象 也就是说我们需要在写代码的时候 编译期或者编译期之前 就知道我们要实例化哪一个类 运行哪一个方法 这种通常
  • Mysql 乱码问题--如何查看和修改Mysql 的字符集

    MySQL会出现中文乱码的原因不外乎下列几点 1 server本身设定问题 例如还停留在latin1 2 table的语系设定问题 包含character与collation 3 客户端程式 例如php 的连线语系设定问题 强烈建议使用ut
  • Java编程--IO流(Ⅱ 字节流)

    Java编程 IO流 字节流 File类虽然可以操作文件 但是并不是操作文件的内容 若要进行文件内容的操作只能通过两种途径完成 字节流和字符流 若要进行输入及输出操作一般都会按照如下的步骤进行 以文件操作为例 1 通过File类定义一个要操
  • JAVA正则表达式Pattern类与Matcher类详解

    java util regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包 它包括两个类 Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式 Matcher 一个Matche
  • Java线上CPU内存冲高问题排查步骤

    1 引言 作为一名从事Java开发快一年的程序员 在线上经常碰到某个模块的Pod发出CPU与内存告警的问题 而这些问题会导致系统响应缓慢甚至是服务不可用 一般情况下可以通过重启或者调高Pod的资源量或者增加Pod数量暂时解决问题 但这是治标
  • 完整实现 - 通过 DelayQueue 实现延时任务

    一 DelayQueue 的应用原理 二 订单延时任务的实现 三 订单处理 四 优缺点 实现延时任务有很多的方法 网上关于延时任务的实现的文章已经不少了 比如 实现延时任务的 10 种方法等等 但是这些文章基本上都是将方法大概的列举一下 给
  • JAR 文件揭密

    JAR 文件揭密 探索 JAR 文件格式的强大功能 转载 原文地址 http www ibm com developerworks cn java j jar 简介 大多数 Java 程序员都熟悉对 JAR 文件的基本操作 但是只有少数程序
  • Spring MVC+Jquery Ajax 前后台传递Json对象

    关于Spring MVC3 X 接收和返回Json 最近开发项目时遇到此问题 解决后 特做下备忘 1 javabean 1 Content java public class Content implements Serializable
  • 我人傻了,阿里面试怎么这么难!三面侥幸拿到offer,坎坷经历分享

    阿里的招聘十分火热 基本上全年都是铺天盖地的宇宙条的招聘信息 但是其实录取率并不高 无论是找后端方向还是其它方向 我相信整个面试的过程和时间节点都能对你有一定的帮助 阿里的面试流程基本上是我面过的公司中最快的 效率最高的 整体上来说 面试的
  • SpringBoot - 配置类的实现

    一 基本用法 1 基本介绍 Spring Boot 推荐使用 java 配置完全代替 XML 配置 java 配置是通过 Configration 和 Bean 注解实现的 二者作用如下 Configration 注解 声明当前类是一个配置
  • 输入第一个字符串A,输入第二个字符串B,统计B在A中出现的次数 abcabcabd abc

    public class strCount public static void main String args 定义字符串 String str abc String ss abcabcabc 定义返回的次数 int count 0 f
  • Java开发学习----AOP通知获取数据(参数、返回值、异常)

    前面的博客我们写AOP仅仅是在原始方法前后追加一些操作 接下来我们要说说AOP中数据相关的内容 我们将从 获取参数 获取返回值 和 获取异常 三个方面来研究切入点的相关信息 前面我们介绍通知类型的时候总共讲了五种 那么对于这五种类型都会有参
  • 使用Jfreechart实现带热点的饼状图

    JFreeChart是JAVA平台上的一个开放的图表绘制类库 它完全使用JAVA语言编写 是为applications applets servlets 以及JSP等使用所设计 JFreeChart可生成饼图 pie charts 柱状图
  • IDEA中如何导入module并成功运行

    在写Java项目的时候我们通常需要导入module 需要注意的是导入过程需要以下两大步骤 否则会出现无法运行的情况 以下我以导入 service edu 模块为例 一 将module文件拷贝到工程目录下 直接将需要导入的module文件 s
  • Java中的Set集合接口实现插入对象不重复的原理

    java lang Object中对hashCode的约定 1 在一个应用程序执行期间 如果一个对象的equals方法做比较所用到的信息没有被修改的话 则对该对象调用hashCode方法多次 它必须始终如一地返回同一个整数 2 如果两个对象
  • Java 通过HttpURLConnection Post方式提交json,并从服务端返回json数据

    这个技术和xml差不过 主要是服务端代码稍微修改 客户端代码修改部分传递参数就可以完成 但在之前需要导入json所需要的jar包 PostJson java代码 package PostPager import java io InputS
  • Tomcat中404/500 错误,自定义错误页面

    Tomcat中404 500 错误 自定义错误页面 当服务器出现404 500错误时候希望能够给用户友好的现实界面 只需要在项目的web xml中添加一些配置
  • Java面向对象——多态、Object类、instanceof关键字以及final关键字

    多态的概念 1 多态是指同一个方法调用可以在不同的对象上有不同的表现 即同一种方法调用方式适用于不同的数据类型 编译时和运行时 编译时期调用的是父类中的方法 但运行时期会根据实际的对象类型来调用适当的方法 这种行为称为动态绑定 即运行时决定
  • 多态的实现

    多态 之前介绍过多态的概念就是基类引用派生类对象且和派生类有相同的同名覆盖函数 那么现在我们就具体讲讲怎么实现多态 类方法实现多态性有两种方法 1 方法重载 可以声明多个同名但参数个数 类型 和顺序不同的方法 编译时根据参数 个数 类型和顺
  • 纯java实现相片转素描

    1 实例演示图片转素描效果 首先我们来看一下具体的效果 在项目中添加依赖

随机推荐

  • 硬件系统工程师宝典(30)-----降压式Buck电路分析

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们说到DC DC变换中的开关调节模式有功耗小 效率高并且稳压范围宽的特点以及DC DC的指标参数和设计要求 今天我们来分析一下DC DC中的一个典
  • Flutter flutter.minSdkVersion的实际文件位置

    Flutter 项目的Android相关版本号配置 flutter minSdkVersion 的版本号配置文件实际路径 flutter sdk packages flutter tools gradle src main groovy f
  • 总结:linux笔记-004

    一 Linux network详解 1 linux中网路相关的主要的几个配置文件 etc hosts 配置主机名 域名 和IP地址的对应 etc sysconfig network 配置主机名和网关 etc sysconfig networ
  • 【服务器基础资源巡检,含常用命令解析】

    在工作中经常去搜这些命令解析 于是整理了一下供大家参考 一 内存占用 二 磁盘占用 三 CPU占用 一 内存占用 使用free指令会显示内存的使用情况 包括实体内存 虚拟的交换文件内存 共享内存区段 以及系统核心使用的缓冲区等 参数如下 b
  • Vue 3第三章:模板语法及指令介绍

    文章目录 1 插值表达式 1 1 声明变量可直接在模板中使用 采用 变量名称 的方式 1 2 模板语法支持三元表达式 1 3 模板语法支持运算 1 4 模板语法支持方法调用 2 指令 2 1 v bind 用于绑定属性或动态绑定对象的值到元
  • uniapp中开发小程序使用ref获取dom实例,一直显示undefined,竟然发现是这个原因!

    小程序是不能使用getElementById之类的dom api 所以考虑使用ref来获取dom元素 但事实上并不是如此 绑定ref后并没有输出我想要的dom元素 既然console log this refs iRef 为undefine
  • 简单易懂的Git回滚操作(reset、revert)

    简单易懂的Git回滚操作 reset revert 一 问题描述 二 背景知识 git的版本管理 及HEAD的理解 三 解决方法 方法一 git reset 具体操作 方法二 git revert 具体操作 一 问题描述 在利用github
  • 在命令行运行 VSCode(macOS)

    在命令行运行 VSCode macOS系统 Windows 版 VSCode 的安装脚本带着一个是否把 Code 加入 PATH 的选项 而 macOS版却没有 有的人想到给 VSCode 做一个符号链接加入 PATH 中 但实际上这样做会
  • IBM power小型机HMC管理口默认IP地址和ASMI默认密码

    IBM硬件管理控制台 Hardware Management Console 提供了标准的用户接口来配置和管理Power System系列服务器以及服务器上的分区 通过HMC软件可以管理服务器 POWER5 HMC控制地址 192 168
  • HCIP——BGP第一天实验

    一 实验要求 除R5的5 5 5 0环回外 其他所有环回均可互相访问 二 实验拓扑 三 实验过程 1 配置IP地址 R1 r1 int g0 0 1 r1 GigabitEthernet0 0 1 ip add 12 1 1 1 24 r1
  • STM32 电机教程 29 - 无刷无感入门1

    前言 无刷直流 Brushless Direct Current BLDC 电机是一种正快速普及的电机类型 它可在家用电器 汽车 航空航天 消费品 医疗 工业自动化设备和仪器等行业中使用 正如名称指出的那样 BLDC 电机不用电刷来换向 而
  • uvm的config_db

    config db 是用于在各个uvm对象里传递参数 一般参数类型 是interface int等 据说参数必须是静态类型 这个可以在uvm config db相关代码里确认 后来知道 config db还能设置sequence和seque
  • C#如何从数据库SQLServer中同时读取多个结果集

    当需要从数据库中同时读取多个结果集时 比如执行如下的sql语句 select from tblClass select from tblStudent 同时从两个表格中获取结果 会获取两个结果集 此时需要使用SqlDataReader对象的
  • vue使用threejs加载模型问题整理

    1 如果出现错误 THREE WebGLRenderer Error creating WebGL context 需要开启浏览器的gpu加速 GPU acceleration 地址栏输入 chrome flags ignore gpu b
  • 国考省考申论:归纳概括多个主体身上的优秀品质,透过动词现象(怎么做的),找到名词(精神品质)本质

    国考省考申论 归纳概括多个主体身上的优秀品质 透过动词现象 怎么做的 找到名词 精神品质 本质 2022找工作是学历 能力和运气的超强结合体 公务员特招重点就是专业技能 附带行测和申论 而常规国考省考最重要的还是申论和行测 所以大家认真准备
  • dede:list分页与控制文章标题显示字数

    关于dedecms分页 百度上也有许多教程 本人记性不好所以写个博客保存下来 pagesize控制每页显示条数 在 dede list 结束标签 后边写上 dede pagelist 标签即可 如何控制文章显示字 让溢出部分用 代替呢 其实
  • IPS与防火墙旁路部署

    一 防火墙旁路部署 实现防护功能的同时 可以完全不需改变用户的网络环境 并且可以避免设备对用户网络造成中断的风险 用于把设备接在交换机的镜像口或者接在 HUB 上 保证外网用户访问服务器的数据经过此交换机 并且设置镜像口的时候需要同时镜像上
  • iview+page封装+强制刷新

    前言 iview的page封装 缺点无法固定页码按钮数量 而且current的页面恢复选中第一个实现不了 这里动态写了强制刷新的方法 下面是组件cpage vue
  • 【Spring

    上篇 Spring 事件监听概述 对 Spring 事件监听的机制有了个基本的了解 本篇来详细的解读下Spring 的 事件监听机制 事件监听详解 ApplicationEvent ApplicationListener 基于注释 异步 排
  • 多态的实现

    多态 之前介绍过多态的概念就是基类引用派生类对象且和派生类有相同的同名覆盖函数 那么现在我们就具体讲讲怎么实现多态 类方法实现多态性有两种方法 1 方法重载 可以声明多个同名但参数个数 类型 和顺序不同的方法 编译时根据参数 个数 类型和顺