Java多态详解(1)

news2025/1/12 1:42:21

多态

多态的概念

所谓多态,通俗地讲,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态

比如:

 这一时间爆火的“现代纪录片”中,麦克阿瑟总是对各种“名人”有不同的评价,这也可看做多态。 

总的来说:同一件事情,发生在不同对象身上,就会产生不同结果

多态的实现条件

在Java中要实现多态,必须满足以下几个条件,缺一不可:

1.必须在继承体系下(向上转型)

2.子类必须对父类中的方法进行重写

3.通过父类的引用调用重写的方法

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

举个例子:

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 Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(name + "吃骨头");
    }
}

class Cat extends Animal {
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(name + "吃鱼干");
    }
}

public class TestAnimal {
    //编译器在编译代码的同时,并不知道要调用Cat还是Dog中的eat方法
    //等程序运行起来后,形参a引用的具体对象确定后,才知道调用哪个方法
    //注意:此处的形参类型必须是父类类型才可以
    public static void eat(Animal a) {
        a.eat();
    }

    public static void main(String[] args) {
        Dog dog = new Dog("小七", 2);
        Cat cat = new Cat("元宝", 1);
        eat(dog);
        eat(cat);
    }
}

当类的调用者在编写eat这个方法时,参数类型为Animal(父类),此时在该方法内部不知道 ,也不关注当前的a引用指向的是哪个类型(哪个子类)的实例。此时a这个引用调用的eat方法可能会有多种不同的表现(和a引用的实例相关),这个行为就叫多态。

重写

重写(override):也称为覆盖。重写是子类对父类非静态,非private修饰,非final修饰,非构造方法等的实现过程进行重新编写,返回值和形参都不能改变,即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的方法。也就是说子类能够根据需要实现父类的方法。

方法重写的规则

1.子类在重写父类的方法时,一般必须与父类方法原型一致:即返回值类型 方法名(参数列表)要完全一致

2.被重写的方法返回值类型可以不同,但是必须具有父子关系的

3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为protected

4.父类被static,private,final修饰的方法都不能被重写

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

重写和重载的区别

区别点重写(override)重载(overlaod)
参数列表一定不能修改必须修改
返回类型一定不能修改(除非可以构成父子类关系)可以修改
访问限定符不能做更严格的限制(可以降低限制)可以修改

即:方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现

重写的设计原则

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

例如:若干年前的手机,只能打电话,发短信,来电显示只能显示号码,而今天的手机在来电显示的时候,不仅仅可以显示电话号码,还可以显示地区,姓名等。在这个过程当中,我们不应该在原来老的类上进行修改,因为原来的类,可能还有用户使用,正确的做法是:新建一个手机类,对来电显示进行方法重写即可,这就达到了今天的需求

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

动态绑定:也成为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能确定具体调用哪个方法。

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

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

相关文章

Linux常用命令——dircolors命令

在线Linux命令查询工具 dircolors 置ls命令在显示目录或文件时所用的色彩 补充说明 dircolors命令设置ls命令在显示目录或文件时所用的色彩。dircolors可根据[色彩配置文件]来设置LS_COLORS环境变量或是显示设置LS_COLORS环境变量的命令。 语法 dircolors(选项)(参数)选项…

如何区分闰年与平年

首先要明白 地球绕太阳运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末…

指令:指令执行过程、指令寻址、指令组成、数据寻址、补充(扩展操作码指令格式)

计算机的工作过程是执行程序的过程,程序是一系列按一定顺序执行的指令。 指令是指挥机器执行某种操作的命令,是计算机运行的最小功能单元(一组二进制代码)。 指令系统:计算机中所有指令的集合,也称指令集…

idea安装插件JRebel

一、安装插件 二、下载代理服务并启动 首先下载服务,网址 Releases ilanyu/ReverseProxy (kgithub.com) 下载后直接双击运行,杀毒软件可以会报警告,直接忽略就行 启动好,等着就行,接下来会用到。 三、在线获取GUID …

通讯协议044——全网独有的OPC HDA知识一之聚合(十二)持续坏值时间

本文简单介绍OPC HDA规范的基本概念,更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化,以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…

Python绘图系统6:自定义坐标列表控件

文章目录 自定义坐标列表控件显示和隐藏加载按钮坐标设置控件的显示和隐藏源代码 Python绘图系统: 基础:将matplotlib嵌入到tkinter 📈简单的绘图系统 📈数据导入📈三维绘图系统自定义控件:坐标设置控件&a…

Threejs学习04——球缓冲几何体环境光以及直线光源

实现随机多个三角形随机位置随机颜色展示效果 这是一个非常简单基础的threejs的学习应用!本节主要学习的是球面缓冲几何体在环境光合直线光源下的效果,可以学习到环境光和直线光源的生成效果等功能!主要使用的是球缓冲几何体对象SphereGeome…

综合能源系统(8)——综合能源系统支撑技术

1、大数据技术 1.1、大数据技术概述 大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 维克托迈尔舍恩伯格和肯尼斯克耶编写…

【面试八股文】每日一题:谈谈你对IO的理解

谈谈你对IO的理解 每日一题-Java核心-谈谈你对对IO的理解【面试八股文】 1.Java基础知识 Java IO(Input/Output)是Java编程语言中用于处理输入和输出的一组类和接口。它提供了一种在Java程序中读取和写入数据的方法。 Java IO包括两个主要的部分&#x…

从零开始学习 Java:简单易懂的入门指南之Objects、BigInteger、BigDecimal(十四)

常用API,Objects、BigInteger、BigDecimal 5 Objects类5.1 概述5.2 常见方法 6 BigInteger类6.1 引入6.2 概述6.3 常见方法6.4 底层存储方式: 7 BigDecimal类7.1 引入7.2 概述7.3 常见方法7.4 底层存储方式: 5 Objects类 5.1 概述 tips&…

optee中如何开启或关闭所有中断的

我们知道在Linux Kernel中开启或关闭中断的函数是:local_irq_enable()和local_irq_disable(), 那么在optee os中是怎样做到的呢? optee中通过使用thread_mask_exceptions()和thread_unmask_exceptions()来开启或关闭中断。 thread_mask_exceptions()和thread_unmask_excepti…

C语言:选择+编程(每日一练)

目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:尼科彻斯定理 示例1 题二:等差数列 示例2 本人实力有限可能对一些地方解释和理解的不够清晰&…

【C++深入浅出】初识C++中篇(引用、内联函数)

目录 一. 前言 二. 引用 2.1 引用的概念 2.2 引用的使用 2.3 引用的特性 2.4 常引用 2.5 引用的使用场景 2.6 传值、传引用效率比较 2.7 引用和指针的区别 三. 内联函数 3.1 内联函数的概念 3.2 内联函数的特性 一. 前言 上期说道,C是在C的基础之上&…

Linux Kernel的local_irq_enable()和local_irq_disable()函数

代码如下图所示,最终操作的是msr daifset, #3 和 msr daifclr, #3 寄存器。 (include/linux/irqflags.h) #define local_irq_enable() do { raw_local_irq_enable(); } while (0) #define local_irq_disable() do { raw_local_irq_disable(); } while (0)#define ra…

历数浙大MPA提前批面试的三大变化

从2019年招生开始,浙大mpa项目的招生趋势一直处于稳增状态,特别是提前批面试政策的出现,更加为项目的整体招录添上神奇的一笔。为什么要举行提面?一方面报考的人数比较多,有了选拔的余地和基础;另一方面也能…

Python学习笔记_进阶篇(一)_浅析tornado web框架

tornado简介 1、tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于…

【办公自动化】使用Python批量生成PPT版荣誉证书

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

LeetCode--HOT100题(33)

目录 题目描述:148. 排序链表(中等)题目接口解题思路代码 PS: 题目描述:148. 排序链表(中等) 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 LeetCode做题链接&#xff1…

SpringBoot项目集成ElasticSearch服务

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍优势说明集成过程1.引入依赖2.添加配置文件3.初始化 示例说明代码结果 总结提升 版本介绍 Spring boot的版本是: 2.3.12   ElasticSearch的版本是:7.6.2 背景介绍 在我们的项目中经常会遇到对于…

《Linux从练气到飞升》No.15 Linux 环境变量

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…