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,一经查实,立即删除!

相关文章

前端工程化之:webpack1-1(构建工具)

一、浏览器端的模块化 1.问题 效率问题:精细的模块划分带来了更多的 JS 文件,更多的 JS 文件带来了更多的请求,降低了页面访问效率;兼容性问题:浏览器目前仅支持 ES6 的模块化标准,并且还存在兼容性问题&…

Hive之set参数大全-17

配置是否启用 HiveServer2 的 Web 用户界面(WebUI)中的跨源资源共享(CORS) 在 Hive 中,hive.server2.webui.enable.cors 是一个参数,用于配置是否启用 HiveServer2 的 Web 用户界面(WebUI&…

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 …

Nacos注册中心:揭秘分布式系统的灵魂之所

目录 一、Nacos注册中心简介 1.1 概述 1.2 作用和意义 二、Nacos的特点和优势

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

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

物理服务器

物理服务器 物理服务器是一种独立的、非虚拟化的计算机设备,它通常被用作高性能应用、数据库、存储和网络等关键业务应用的运行平台。物理服务器可以提供更高的处理能力、更好的安全性和可靠性,但需要用户自行维护和管理。 物理服务器的形式多种多样&…

图论-寒假

文章目录 A - Amusement Arcade题意:题解:代码: B - Brexiting and Brentering题意:题解:代码: I - Montys Hall题意:题解:代码: A - Amusement Arcade 题意&#xff1a…

每日一道编程题:回文数

题目 一串字符如果从左读和从右读完全相同&#xff0c;我们称之为回文。请判断键盘输入一串字符&#xff08;不超过1000位&#xff09;&#xff0c;是否是回文。是&#xff0c;则输出YES&#xff0c;否则输出NO。 输入样例 1aabbccbbaa1输出样例 YES代码 #include <bit…

k8s-调度

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

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

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

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

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

【最佳实践】Go 组合模式对业务解耦

在 Go 语言中&#xff0c;组合模式&#xff08;Composition&#xff09;是通过嵌入结构体&#xff08;embedding structs&#xff09;来实现的。它允许我们构建复杂的对象&#xff0c;通过将简单对象组合成树形结构来表示整个部分的层次结构。在 Go 中&#xff0c;这种模式不仅…

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

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

《合成孔径雷达成像算法与实现》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); …

uniapp+极光做消息推送

借鉴地址uniapp极光做消息推送_uniapp 极光 配置 ios 自定义消息-CSDN博客

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

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

Python 办公自动化主要Excel,PPT,Word,邮件,再加上数据分析、爬虫等

python办公自动化 Python 办公自动化主要Excel&#xff0c;PPT&#xff0c;Word&#xff0c;邮件&#xff0c;再加上数据分析、爬虫等技能#####Excel自动化 pip install xlwings pip install openpyxl 实现对Excel表格的读、写、格式调整、自动化图表生成等 以下用xlwings进行…

主成分分析(PCA)Python

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