Java面向对象三大特征之多态

在之前的文章,我们分别介绍了类与对象、面向对象三大特征的封装、以及继承(一)、继承(二)。这一篇文章,我们介绍Java面向对象三大特征的最后一个——多态


多态

多态的概述

  1. 概念完成某个行为,当不同的对象去完成时会产生出不同的状态;

例如猫和狗一样喊叫,虽然行为是相同的,但是状态(行为表现)不同。

  1. 体现:在代码运行时,当传递不同类对象时,会调用对应各自类中的方法。

例如调用Cat.shout() 和 Dog.shout()。

多态的缺陷

  1. 代码的运行效率降低。

  2. 属性没有多态性,当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性 。

  3. 构造方法没有多态性 。

多态实现的三个条件

  1. 要有继承(包括接口的实现)(前提条件)
    (接口会在下一文介绍)

  2. 子类必须对父类方法进行重写(前提条件)

  3. 向上转型,并通过父类的引用调用重写的方法
    当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象。

下面我们先来了解重写,再来了解向上转型。

重写和重载

概念

  1. 方法的重写是指子类重新定义父类中已经存在的方法,而方法的重载是指在同一个类中定义多个方法,具有相同的名称但是不同的参数

  2. 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现
    (注意:重写也称覆盖Overrride,重载Overload)

重写

使用情况

父类中的方法,无法满足子类的业务需求,子类需要对方法进行重写(覆盖)。

重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验.例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写。

使用@Override便于检查。

构成重写所需的满足条件

第一:有继承关系的两个类
第二:具有相同方法名、返回值类型(或具有父子关系)、形式参数列表。

比如父类方法中返回值是Animal,子类方法中返回值是Animal的子类Dog

第三:访问权限不能小于父类权限。
第四:抛出异常不能更多。

注意:父类的构造方法staticfinal方法不能重写,成员变量不存在重写。
这是访问修饰符权限表。
访问修饰符

重写的设计原则

对于已经投入使用的类,尽量不要进行修改。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。

重载

  • 概念:一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同。
  • 条件:被重载的方法必须改变参数列表(参数个数或类型不一样)。
  • 体现:同样的一个方法能够根据输入数据的不同,做出不同的处理。
  • 重载函数的返回值可变可不变
  • 可以改变访问修饰符

重写与重载的区别

重写与重载的区别

动态绑定

下面我们来介绍一下动态绑定。

当调用一个方法名时,究竟应该调用哪个方法,这件事情叫做绑定。绑定表明了调用一个方法的时候,我们使用的是哪个方法。
绑定有两种:
一种是早绑定,又称静态绑定,这种绑定在编译的时候就确定了;另一种是晚绑定,即动态绑定。
动态绑定在运行的时候根据变量当时实际所指的对象的类型动态决定调用的方法。Java默认使用动态绑定。

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表重载

动态绑定:称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。 这也是多态的特征

向上转型和向下转型

向上转型

指父类引用类型变量 指向 子类对象,
如父类Animal类型变量指向子类Dog对象。

Animal animal = new Dog();

如果在这里不清晰创建对象过程,可到Java——从建立一个类开始(类与对象总结)里面了解了解。

  • 实际就是创建一个子类对象,将其当成父类对象来使用

  • 实现对不同子类对象的统一处理

  • 只用向上转型可以实现多态性

  • 使用场景:

    1. 直接赋值父类类型 对象名 = new 子类类型( ),子类对象赋值给父类对象。

    2. 方法传参:若一个方法的形参为父类型引用,则可以接收任意子类对象

    3. 方法返回:若一个方法的返回值是父类型,则可以返回任意子类对象。

  • 向上转型的优点:让代码实现更简单灵活。
    向上转型的缺陷:不能调用到子类特有的方法。

向下转型

将父类的引用变量转化为具体的子类对象。
如上面的父类变量animal转化为子类对象dog。

Animal animal = new Dog();
Dog dog = (Dog) animal;
  • 格式: 子类 对象名 = (子类)父类引用变量
  • 应用情况:当进行向上转型后,若还需要调用子类特有的方法,可以将父类引用再还原为子类对象,即向下转型。
  • 无法根据此格式将子类对象还原为父类对象。
  • Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换。用来判断左边的对象是否为右边类的实例,是返回true,不是返回false。
    示例代码:
class Animal {String name;int age;public Animal(String name, int age){this.name = name;this.age = age;}public void eat(){System.out.println(name + "吃饭");}
}
class Cat extends Animal{public Cat(String name, int age){super(name, age);}@Overridepublic void eat(){System.out.println(name+"吃鱼~~~");}void mew(){System.out.println(name + "喵喵喵~~~");}
}
class Dog extends Animal {public Dog(String name, int age){super(name, age);}@Overridepublic void eat(){System.out.println(name+"吃骨头~~~");}void bark(){System.out.println(name + "汪汪汪~~~");}
}///分割线//public class Main {// 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法
// 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法
// 注意:此处的形参类型必须时父类类型才可以public static void main(String[] args) {Cat cat = new Cat("元宝",2);Dog dog = new Dog("小七", 1);// 向上转型Animal animal = cat;animal.eat();animal = dog;animal.eat();if(animal instanceof Cat){cat = (Cat)animal;cat.mew();}if(animal instanceof Dog){dog = (Dog)animal;dog.bark();}}}

输出:
运行结果


下面是《Java面向对象三大特征》这几篇文章的参考链接:
(1) (2) (3) (4) (5)
(6) (7) (8) (9) (10)
(11) (12) (13) (14)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2024-23897 Jenkins 任意文件读取漏洞

项目介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。Jenkins是开源CI&CD软件领导者, 提供超过1000个插…

Java集合相关面试题

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📗本文收录于java面试题系列,大家有兴趣的可以看一看 📘相关专栏Rust初阶教程、go语言基…

C# 设置一个定时器函数

C#中,创建设置一个定时器,能够定时中断执行特定操作,可以用于发送心跳、正计时和倒计时等。 本文对C#的定时器简单封装一下,哎,以方便定时器的创建。 定义 using Timer System.Timers.Timer;class SetTimer {Timer …

OSPF协议基础(OSPF工作过程)

目录 OSPF基本工作原理邻居建立过程Router ID发现并建立邻居 - Hello报文OSPF邻居建立过程 链路状态信息丰富的数据链路层支持能力网络类型 - P2P网络网络类型 - 广播型网络网络类型 - NBMA网络网络类型 - P2MP网络OSPF的度量方式 报文类型及作用OSPF协议报文头部OSPF报文类型O…

k8s-调度

调度 从上面的架构图我们可以看到,调度是工作在Master,负责调度Pod,为POD分配Node。 调度的工作原理 #查看所有的Node kubectl get nodes 我们可以看到节点有一个Name,这就是调度的关键。 调度的步骤: 1 创建POD的时候每一个POD都会有一个叫NodeName的…

老板为何都对项目经理毕恭毕敬!因为这个职位一念成佛一念成魔

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 老板为何都对项目经理毕恭毕敬!因为这个职位一念成佛一念成魔 曾几何时&am…

Linux:命名管道及其实现原理

文章目录 命名管道指令级命名管道代码级命名管道 本篇要引入的内容是命名管道 命名管道 前面的总结中已经搞定了匿名管道,但是匿名管道有一个很严重的问题,它只允许具有血缘关系的进程进行通信,那如果是两个不相关的进程进行通信&#xff0…

《佛法修学概要》009-012集研讨

课程摘要 9、只有走出心中的妄想,才可能接觸彌陀的光明! 佛陀在經典裡講出一個譬喻,說有一座動物園,這座動物園關了很多動物。其中有一隻袋鼠,就是澳洲那種很會跳的袋鼠。動物園的管理員,給牠圈了一個十公尺…

《合成孔径雷达成像算法与实现》Figure5.16

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

【vue oidc-client】invalid_requestRequest Id: 0HN0OOPFRLSF2:00000002

需求:完成统一登录,需要从三方平台跳到我们的平台。 oidc-client报错记录。这个一般是配置信息出错,需要和三方平台进行沟通,一定要把client_id,密钥进行对应; 同时关于此次出错还修改了以下代码&#xff…

主成分分析(PCA)Python

实际问题研究中,常常遇到多变量问题,变量越多,问题往往越复杂,且各个变量之间往往有联系。于是,我们想到能不能用较少的新变量代替原本较多的旧变量,且使这些较少的新变量尽可能多地保留原来变量所反映的信…

按配置数据绘制配置型地图marker的icon,自定义marker

一、需求 需要自定义配置数据的marker&#xff0c;其中图片内容要灵活可配置自动生成。此处项目用的百度地图。 效果图&#xff1a; 二、思路 用背景图canvas绘制数字的方式生成icon的图片资源。 再将icon生成对应地图marker。 三、代码 canvasImg.js <!-- * descrip…

进程地址空间(Linux)

进程地址空间 一、引入概念1. 程序的地址分布2. 线性地址和物理地址 二、进程地址空间1. 初步认识2. 地址空间和物理内存的联系3. 区域划分4. 拓展——关于“线” 三、进一步理解进程地址空间四、页表总结 一、引入概念 1. 程序的地址分布 测试代码&#xff1a; #include &l…

Nginx安装以及具体应用

文章目录 Centos7安装NginxNginx命令Nginx具体应用反向代理 location指令说明负载均衡动静分离 Nginx.conf配置详解 Centos7安装Nginx 下载地址&#xff1a;nginx: download 中间这个就是tar.gz包 Centos7安装Nginx 下载nginx-1.16.1.tar.gz上传到Centos7中的/user/local目…

java8 流到底是什么呢?

引入背景&#xff1a; 1、想像写SQL那样操作集合 2、为了提高性能&#xff0c;需要并行处理&#xff0c;并利用多核架构 流到底是什么呢&#xff1f; 流是Java API的新成员&#xff0c;它允许你 以声明性方式处理数据集合&#xff08;通过查询语句来表达&#xff0c;而不是临时…

springboot+vue3组合,对接支付宝付款第一节:内网穿透

springbootvue3组合,对接支付宝付款第一节:内网穿透&#xff01;接下来会为大家展示&#xff0c;使用java的springboot搭建一个简单的后台。提供业务接口。实现在线下单&#xff0c;支付。支付宝付款的案例。 前端页面布局我们使用vue3element-plus来实现绘制。 今天是第一个…

海康实时监控预览视频流接入web

我们采取的方案是后端获取视频流返回给前端&#xff0c;然后前端播放 海康开放平台海康威视合作生态致力打造一个能力开放体系、两个生态圈&#xff0c;Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上&#xff0c;…

Jmeter连接数据库报错Cannot load JDBC driver class‘com.mysql.jdbc.Driver’解决

问题产生: 我在用jmeter连接数据库查询我的接口是否添加数据成功时,结果树响应Cannot load JDBC driver class com.mysql.jdbc.Driver 产生原因: 1、连接数据库的用户密码等信息使用的变量我放在了下面,导致没有取到用户名密码IP等信息,导致连接失败 2、jmeter没有JDB…

CodeGPT--(Visual )

GitCode - 开发者的代码家园 gitcode.com/ inscode.csdn.net/liujiaping/java_1706242128563/edit?openFileMain.java&editTypelite marketplace.visualstudio.com/items?itemNameCSDN.csdn-codegpt&spm1018.2226.3001.9836&extra%5Butm_source%5Dvip_chatgpt_c…

Elasticsearch介绍以及基本操作

目录 一、Elasticsearch介绍 二、关于Elasticsearch的基本操作 &#xff08;1&#xff09;索引操作 &#xff08;2&#xff09;文档操作 三、域的属性 &#xff08;1&#xff09;index &#xff08;2&#xff09;type &#xff08;3&#xff09;store 一、Elasticsearc…