Java学习手册:多态的实现机制(重载和覆盖)

【打卡帖】7日玩转ESP32——(第4日) 串口的输入输出 【福利帖】7日玩转ESP32——(第4日) 串口的输入输出 阅读详情

一、多态的实现机制

多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对象时,会有不同的语义,从而会产生不同的结果。在Java中,多态主要有以下两种表现方式:

(1)方法的重载(overload)
重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。重载可以被看做一个类中的方法多态性。

(2)方法的覆盖(override)
子类可以覆盖父类的方法,因此同样的方法会在父类与子类中有着不同的表现形式。在Java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现的实例对象。而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过这种动态绑定的方法实现了多态。由于只有在运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态。示例如下:

package com.haobi;
/*
 * Oberride Demo(覆盖)
 */
class Base{
	public Base() {
		g();
	}
	public void f() {
		System.out.println("Base f()");
	}
	public void g() {
		System.out.println("Base g()");
	}
}
class Derived extends Base{
	public void f() {
		System.out.println("Derived f()");
	}
	public void g() {
		System.out.println("Derived g()");
	}
}
public class Test5 {
	public static void main(String[] args) {
		Base b = new Derived();
		b.f();
		b.g();
	}
}
//程序输出结果如下:
Derived g()
Derived f()
Derived g()

在上述程序中,由于子类Derived的f()方法和g()方法与父类Base的方法同名,因此Derived的方法会覆盖Base的方法。在执行Base b = new Derived()语句时,会调用Base类的构造函数,而在Base的构造函数中,执行了g()方法,由于Java语言的多态特征,此时会调用子类Derived的g()方法,而非父类Base()的g()方法,因此会输出Derived g()。由于实际创建的是Derived对象,后面的方法调用都会调用子类Derived的方法。

此外,只有类中的方法才有多态的概念,类中成员变量没有多态的概念。


二、多态的意义

(1)同一类型的引用在指向不同的对象时有不同的实现——行为的多态

(2)同一个对象被造型为不同的类型时有不同的功能——对象的多态


三、重载和覆盖的区别

重载(Overload)和覆盖(Override)是Java多态性的不同表现方式。

重载(Overload):
同一个类中,方法名相同,参数列表不同。
遵循编译器绑定,根据参数类型绑定方法。

覆盖(Override):
父子类中,方法名相同,参数列表相同。
遵循运行期绑定,根据对象的类型来调用方法。

区别点重载覆盖
单词overloadoverride
定义方法名称相同,参数的类型或个数不同方法名称、参数类型、返回值类型全部相同
范围发生在一个类中(和返回值类型以及返回值无关)发生在继承中(两个类→父类和子类)

重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型。在使用重载时,需要注意以下几点:
(1)重载是通过不同的方法参数来区分的,例如不同的参数个数、不同的参数类型或不同的参数顺序。
(2)不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。
(3)对于继承来说,如果基类方法的访问权限为private,那么就不能在派生类对其重载;如果派生类也定义了一个同名的函数,这只是一个新的方法,不会达到重载效果。

覆盖是指派生函数覆盖基类函数。覆盖一个方法并对其重写,以达到不同的作用。在使用覆盖时需要注意以下几点:
(1)派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数。
(2)派生类中的覆盖方法的返回值必须和基类中被覆盖方法的返回值相同。
(3)派生类中的覆盖方法所抛出的异常必须和基类(或是其子类)中被覆盖的方法所抛出的异常一致。
(4)基类中被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对其覆盖。

重载与覆盖的区别主要有以下几个方面:
(1)覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
(2)覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。
(3)覆盖要求参数列表相同;重载要求参数列表不同。
(4)覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。


AIGC算法工程师 面试八股文 1、简述DDPM的算法原理 2、什么是重参数化技巧?Diffusion Models和VAE中的重参数化技巧是如何使用的? VAE中的重参数化技巧 Diffusion Models中的重参数化技巧 3、什么是马尔可夫过程?DDPM中的马尔可夫链是如何定义的? 马尔可夫过程 DDPM马尔可夫链 4、为什么DDPM前向过程中前期加噪少,后期加噪多? 5、VAE和Diffusion Models中的变分推断是什么? 6、Negative Prompt实现的原理是什么? 阅读详情

相关推荐

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 681

Java面向对象三大特性(基础篇)

面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。对语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计,这些对象可以是独立存在的,也可以是从别的对象继承过来的。对象之间通过相互作...

十指波课堂的博客 914

[Stanford CS217]CUDA中矩阵乘法GEMM优化的最关键点:向量内积和向量外积分别取行和取列

对于矩阵C中的每一个tile,矩阵A与矩阵B中的tile只需要读取一次,这样就可以达到 O(N) 的计算强度。理想情况下性能应当受限于算术吞吐量,确切来说对于一个大型方阵,即 M=N=K ,矩阵乘法的数学操作复杂度为 O(N3) ,而数据量为 O(N2) ,同时计算强度为 N (这里的计算强度可以被理解为同一个数据被重复利用的次数)。GEMM就是指计算 C=A∗B+C ,其中 A 、B和C都是矩阵,A是 M×K 的矩阵,B是 K×N 的矩阵, C是 M×N 的矩阵。这就是向量内积和向量外积的最大区别。

weixin_55035144的博客 1426

Java父类中调用子类的方法

接口和继承 public interface In { void doSomething(); } 父类: public class T{ private In in; public void setIn(In in){ this.in = in; } // 需要子类重写的普通方法 protected void layoutChildren() { } public void Hello(){ // 用子类.

梦否 8047

Innovus时钟树综合CTS实战:从原理到signoff的完整指南

时钟树综合(CTS)是数字后端实现中保障同步电路时序收敛的核心环节,其本质是在物理层面构建低偏斜、可控延迟的全局时钟分发网络。它基于静态时序分析(STA)原理,通过平衡clock skew、insertion delay、transition time与功耗面积等多维约束,对抗工艺电压温度(PVT)变异带来的时序不确定性。技术价值在于支撑GHz级高频芯片的setup/hold签核,广泛应用于CPU、GPU、AI加速器等复杂SoC的Innovus后端流程。本文聚焦CTS在Innovus工具链中的工程落地,覆盖

weixin_28523493的博客 223

从FedAvg到实战:手把手教你用PyTorch复现联邦学习经典论文实验(MNIST/CIFAR-10)

本文详细介绍了如何使用PyTorch复现联邦学习经典算法FedAvg在MNIST和CIFAR-10数据集上的实验。从环境搭建、数据非IID划分到模型实现和参数聚合,手把手教你掌握联邦学习的核心技术与实战技巧,帮助开发者和研究人员快速实现隐私保护的分布式机器学习方案。

weixin_29053695的博客 253

C++类中子类和父类的接口相互调用

发现作为代码狗的我,时间久了,都快忘记了一些C++语言的基础知识,现在写篇文章记录一下,内容主要是涉及C++类的多态性,子类和父类的接口相互调用关系。3、在父类中调用子类多态性质的接口,方式是使用虚函数、加override实现,并给父类设置一个上下文。2、外部调用真实类的接口,方式是使用类的多态性实现,虚函数、加override实现。1、在子类中调用父类的接口(主要是重载接口),方式是父类::接口。

langxm2006的专栏 3035

保姆级教程:手把手教你给联想System x 3650 M5服务器配置RAID 5并U盘装系统

本文提供联想System x 3650 M5服务器配置RAID 5并U盘安装系统的详细教程,特别适合零基础运维人员。从准备工作、RAID 5配置到U盘引导和系统安装,涵盖全流程关键步骤与常见问题解决方案,帮助用户高效完成服务器部署。

weixin_42535703的博客 358

Java基础练习3(重载和重写)

1.(多选题)给定java代码如下所示,在1处新增下列()方法,是对show()方法的重载 public class Test{ public void show(int x, int y, int z) { } //1 } A.public int show(int x,int y,float z){return 0;} B.public int show...

weixin_30781775的博客 1094

Deepracer 智能无人车-绿洲科学云平台介绍

Deepracer 智能无人车 绿洲科学云

woaixiyue19831的博客 1946

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4330

【Java基础-面向对象中(2/2)】

Java基础-面向对象中(2/2)方法的重写super关键字子类对象实例化的全过程多态性向下转型instanceof关键字 方法的重写 方法的重写(override / overwrite) 1、重写:子类继承父类以后,可以对父类中的同名同参数的方法,进行覆盖操作。 2、应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。 3、重写的规定: 方法的声明:权限修饰符 返回值 方法名(形参列表) throws 异常类型{ 方法体 } 约定俗成:子类中

m0_48497656的博客 525

【中项第三版】系统集成项目管理工程师 | 第 1 章 信息化发展

【中项第三版】系统集成项目管理工程师 | 第 1 章 信息化发展

静谧、淡雅 6576

Java之封装、继承、多态(重载、重写)_java面向对象 - 封装、继承和多态第4关:方法的重写与重载

面向对象编程三大特性:封装、继承、多态封装:把对象的属性和操作(或服务)结合为一个独立的整体,使得对数据的访问只能通过接口。继承:从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。例如 定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。轿车和卡车都包含有车原先的属性和行为,又扩展了各自装东西的箱子。这时称 轿车与卡车继承了车。多态:允许不同类的对象对同一消息做出响应。

Python_0011的博客 1000

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java学习手册:Java面向对象面试问题

Java学习手册:Java面向对象面试问题

浩比的专栏 821

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【面向对象修炼手册】(三)(行为与多态)(Java宝典)

目前我们已经讨论了类以及对象,又进一步区分了对象和实例的区别。在此基础上,又研究了面向对象编程的思想——利用对象及消息机制解决问题、完成编程。有了这样大框架作为基础,我们可以知道面向对象编程中最主要的东西就两个——1、对象;2、消息传递。消息传递的机制我们已经有了较为深入的研究(这一块并不复杂)。接下来,我们要深入研究的是对象:包括对象的生成对象的组织对象的行为等面向对象技术最主要的就是在研究对象的事情。后面的设计模式和设计原则对应的就是对象的创建、组织和行为。

十二月的猫 1197

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java码农人生开启手册——重载和重写

方法签名,即经过编译器编译修改后方法最终的名字。

2301_76907962的博客 423

Java工程师成神之路基础篇之封装、继承、多态

什么是多态 什么是多态 多态的概念呢比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 如果按照这个概念来定义的话,那么多态应该是一种运行期的状态。 多态的必要条件 为了实现运行期的多态,或者说是动态绑定,需要满足三个条件: 有类继承或者接口实现 子类要重写父类的方法 父类的引用指向子类的对象 简单来一段代码解释下: public class Parent{ public void call(){ sout("im Parent");

r_b_y的博客 195

Java工程师成长修炼手册:01--Java基础特性和字符串

一.三大特性 1.封装 封装,把对象的属性封装起来(使用private修饰符),不被外部程序直接随意调用或修改成员变量。只能通过对象使用public修饰符的set 和 get 方法,来设置和获取成员变量的值。也可以把只在本类内部使用的方法使用 private。另外,还可以封装,隐藏一些方法,需要用的时候,就调用这些方法。这些就是封装。 封装的优点 良好的封装能够减少耦合,可以独立地开发、优化和修改。 类内部的结构可以自由修改,更容易理解,调试的时候可以不影响其他模块。 隐藏信息,实现细节。 可以偷懒,把代

exodus3的博客 1万+

理解Java面向对象特性:封装、继承、多态

文章目录一、多态的理解二、方法重写和重载关注点1:静态绑定和动态绑定关注点2:子类成员变量重复定义,称之为隐藏,而不是重写。关注点3:可见性关注点4:异常三、接口和抽象类的区别与选择(一)语法层面区别(二)设计层面区别 一、多态的理解 多态可以理解为不同的对象执行同一操作,表现不同的行为。针对于不同对象,是通过运行时判断的。运行时多态(动态绑定)有三个必要条件: (1)存在类继承或者接口实现关系 ...

Awecoder的博客 316

Java 12 编程学习手册(一)

本书的目的是让读者对 Java 基础有一个坚实的理解,并引导他们完成一系列从基础到实际编程的实际步骤。讨论和示例旨在通过使用经验证的编程原理和实践来刺激读者专业直觉的增长。这本书从基础知识开始,把读者带到最新的编程技术,从专业的角度考虑。安装并配置 Java 开发环境安装并配置您的集成开发环境IDE)——本质上就是您的编辑器编写、编译和执行 Java 程序和测试了解并使用 Java 语言基础理解并应用面向对象的设计原则掌握最常用的 Java 构造。

龙哥盟 835

Java程序员福音:349页阿里面试通关手册,助我闯进字节跳动

前言 今年的面试比往年要难得多,各个互联网企业对于Java岗位的要求越来越多,也越来越高,主要是初级岗位已经趋近饱和,但高级岗位又相对来说缺乏,这类的人才偏少,因此作为Java开发人员,我们应该思考的是怎么去往高级人才发展,而不是转学其他语言,要懂得去成为金字塔顶端的人,而不是逃避一直做基层的人。 本文主要记录了我面试字节跳动的一个经历以及我在面试前个人的一个准备,当然能够拿到字节的offer,也得益于我拿到一本“Alibaba通关面试手册”,这本手册349页我整整读了28天,收获颇多。 这篇文章主体

bieber007的博客 2331

php重写与重载

转载:https://blog.youkuaiyun.com/binghui1990/article/details/9105237 重写/覆盖 override 指:子类重写了父类的同名方法 (注:1.重写权限不能缩小 2.非静态不能重写成静态,静态也不能重写成非静态 3.参数数量要一样)重载: overload 重载是指:存在多个同名方法,但参数类型/个数不同. 传不同的参数,调用不同的方法...

weixin_30909575的博客 258

私有方法不能被子类覆盖_java4个技巧:从继承和覆盖,到最终的类和方法

日复一日,我们编写的大多数Java只使用了该语言全套功能的一小部分。我们实例化的每个流以及我们在实例变量前面加上的每个@Autowired注解都足以完成我们的大部分目标。然而,有些时候,我们必须求助于语言中那些很少使用的部分:语言中为特定目的而隐藏的部分。本文探索了四种技术,它们可以在绑定时使用,并将其引入到代码库中,以提高开发的易用性和可读性。并非所有这些技术都适用于所有情况,甚至大多数情况。例...

weixin_32063287的博客 370

java4个技巧:从继承和覆盖,到最终的类和方法

日复一日,我们编写的大多数Java只使用了该语言全套功能的一小部分。我们实例化的每个流以及我们在实例变量前面加上的每个@Autowired注解都足以完成我们的大部分目标。然而,有些时候,我们必须求助于语言中那些很少使用的部分:语言中为特定目的而隐藏的部分。 本文探索了四种技术,它们可以在绑定时使用,并将其引入到代码库中,以提高开发的易用性和可读性。并非所有这些技术都适用于所有情况,甚至大多数情况。...

qf2019的博客 402

Java基础速查手册

文章目录类与对象基础概念辨析访问权限嵌套类和内部类包继承与接口子类和父类成员变量隐藏和方法覆盖super关键字上转型对象:多态性体现抽象类接口String / StringBuilder/ StringBufferStringStringBuilder / StringBuffer泛型和集合ArrayList方法TreeSet 类与对象 基础概念辨析 面向对象的好处: 模块化、信息隐藏、代码重用、易于调试。 方法重载overload和方法覆盖override: 重载是多态性的一种,方法名相同,参数不同;覆

CherryChenieth的博客 684
上一篇: Java学习手册:(数据结构与算法-排序)堆排序
下一篇: Java学习手册:static
浩比浩比
博客等级 码龄12年 395粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值