Java:多态乃幸福本源

RT-Thread Studio与CubeMX联合编程(超级详细) RT-Thread Studio与CubeMX联合编程 本文章参考以下文章: https://blog.youkuaiyun.com/qq_40824852/article/details/122596043 https://zhuanlan.zhihu.com/p/395106066 https://blog.youkuaiyun.com/m0_37697335/article/details/108890584 一、简介 经过上次对RT-Thread Studio的初步尝试,发现RT-Thread Studio中存在官方支 阅读详情

01 多态是什么

在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变;一个二郎神,也能七十二变;他们都可以变成不同的形态,但只需要悄悄地喊一声“变”。

Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果。和孙悟空和二郎神都只需要喊一声“变”,然后就变了,并且每次变得还不一样;一个道理。

多态的前提条件有三个:

  • 子类继承父类
  • 子类覆盖父类的方法
  • 父类引用指向子类对象

多态的一个简单应用,来看程序清单1-1:

//子类继承父类
public class Wangxiaoer extends Wanger {
	public void write() { // 子类覆盖父类方法
		System.out.println("记住仇恨,表明我们要奋发图强的心智");
	}

	public static void main(String[] args) {
		// 父类引用指向子类对象
		Wanger[] wangers = { new Wanger(), new Wangxiaoer() };

		for (Wanger wanger : wangers) {
			// 对象是王二的时候输出:勿忘国耻
			// 对象是王小二的时候输出:记住仇恨,表明我们要奋发图强的心智
			wanger.write();
		}
	}
}

class Wanger {
	public void write() {
		System.out.println("勿忘国耻");
	}
}

02 多态与后期绑定

现在,我们来思考一个问题:程序清单1-1在执行wanger.write()时,由于编译器只有一个Wanger引用,它怎么知道究竟该调用父类Wanger的write()方法,还是子类Wangxiaoer的write()方法呢?

答案是在运行时根据对象的类型进行后期绑定,编译器在编译阶段并不知道对象的类型,但是Java的方法调用机制能找到正确的方法体,然后执行出正确的结果。

多态机制提供的一个重要的好处程序具有良好的扩展性。来看程序清单2-1:

//子类继承父类
public class Wangxiaoer extends Wanger {
	public void write() { // 子类覆盖父类方法
		System.out.println("记住仇恨,表明我们要奋发图强的心智");
	}
	
	public void eat() {
		System.out.println("我不喜欢读书,我就喜欢吃");
	}

	public static void main(String[] args) {
		// 父类引用指向子类对象
		Wanger[] wangers = { new Wanger(), new Wangxiaoer() };

		for (Wanger wanger : wangers) {
			// 对象是王二的时候输出:勿忘国耻
			// 对象是王小二的时候输出:记住仇恨,表明我们要奋发图强的心智
			wanger.write();
		}
	}
}

class Wanger {
	public void write() {
		System.out.println("勿忘国耻");
	}
	
	public void read() {
		System.out.println("每周读一本好书");
	}
}

在程序清单2-1中,我们在Wanger类中增加了read()方法,在Wangxiaoer类中增加了eat()方法,但这丝毫不会影响到write()方法的调用。write()方法忽略了周围代码发生的变化,依然正常运行。这让我想起了金庸《倚天屠龙记》里九阳真经的口诀:“他强由他强,清风拂山岗;他横由他横,明月照大江。”

多态的这个优秀的特性,让我们在修改代码的时候不必过于紧张,因为多态是一项让程序员“将改变的与未改变的分离开来”的重要特性。

03 多态与构造器

在构造器中调用多态方法,会产生一个奇妙的结果,我们来看程序清单3-1:

public class Wangxiaosan extends Wangsan {
	private int age = 3;
	public Wangxiaosan(int age) {
		this.age = age;
		System.out.println("王小三的年龄:" + this.age);
	}
	
	public void write() { // 子类覆盖父类方法
		System.out.println("我小三上幼儿园的年龄是:" + this.age);
	}
	
	public static void main(String[] args) {
		new Wangxiaosan(4);
//		上幼儿园之前
//		我小三上幼儿园的年龄是:0
//		上幼儿园之后
//		王小三的年龄:4
	}
}

class Wangsan {
	Wangsan () {
		System.out.println("上幼儿园之前");
		write();
		System.out.println("上幼儿园之后");
	}
	public void write() {
		System.out.println("老子上幼儿园的年龄是3岁半");
	}
}

从输出结果上看,是不是有点诧异?明明在创建Wangxiaosan对象的时候,年龄传递的是4,但输出结果既不是“老子上幼儿园的年龄是3岁半”,也不是“我小三上幼儿园的年龄是:4”。

为什么?

因为在创建子类对象时,会先去调用父类的构造器,而父类构造器中又调用了被子类覆盖的多态方法,由于父类并不清楚子类对象中的属性值是什么,于是把int类型的属性暂时初始化为0,然后再调用子类的构造器(子类构造器知道王小二的年龄是4)。

04 多态与向下转型

向下转型是指将父类引用强转为子类类型;这是不安全的,因为有的时候,父类引用指向的是父类对象,向下转型就会抛出ClassCastException,表示类型转换失败;但如果父类引用指向的是子类对象,那么向下转型就是成功的。

来看程序清单4-1:

public class Wangxiaosi extends Wangsi {
	public void write() {
		System.out.println("记住仇恨,表明我们要奋发图强的心智");
	}

	public void eat() {
		System.out.println("我不喜欢读书,我就喜欢吃");
	}

	public static void main(String[] args) {
		Wangsi[] wangsis = { new Wangsi(), new Wangxiaosi() };

		// wangsis[1]能够向下转型
		((Wangxiaosi) wangsis[1]).write();
		// wangsis[0]不能向下转型
		((Wangxiaosi)wangsis[0]).write();
	}
}

class Wangsi {
	public void write() {
		System.out.println("勿忘国耻");
	}

	public void read() {
		System.out.println("每周读一本好书");
	}
}

05 总结

我喜欢把复杂的事情尽量简单化,把简单的事情有趣化——多态是Java的三大特性之一,它本来需要长篇大论的介绍,但我觉得实在没有必要,把关键的知识点提炼出来就足够了。更重要的是,你要通过实践去感知多态的优秀之处。

Java 技术驿站的chenssy对多态下了一个非常经典的结论,我们不妨大声的朗读几遍:

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定;即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
 

本文原文地址:https://blog.youkuaiyun.com/qing_gee/article/details/84995737

045、镜头模组公差链分析:从 Lens 到 Sensor 的装配公差累积与良率优化 本文深入分析了镜头模组从镜片到传感器各环节的公差累积问题及优化策略。文章首先剖析了四级公差链(镜片单体、镜筒装配、VCM定位、传感器贴装)的误差传递机制,指出各环节典型公差值及其影响(如5微米镜片偏差可导致0.02度光线偏折)。其次对比了最坏情况法与均方根法的差异,强调需考虑公差相关性(如镜片曲率与镜筒间隙的正相关性)。最后提出良率优化"三板斧":通过蒙特卡洛仿真优化公差分配、采用主动对准工艺在线补偿、建立数据反馈闭环系统,并结合"阴阳脸"案例说明如何定位根因(模具磨损+贴片机老化导致的误差叠加)。作者总结 阅读详情

相关推荐

全自动数据分析 - Claude Code Sub-Agents:自动化数据分析工厂

别忘了!claude code也是agent框架,类似langgraph,crewAI,autogen等等agent框架。我改造claude code搞一个数据分析智能体AI。试试看行不行!:让数据分析变得像聊天一样简单!

liangdabiao的博客 1072

TraeWork智能体实战:构建STC单片机开发知识库与代码生成工作流

在嵌入式开发中,单片机编程常面临数据手册查阅繁琐、寄存器配置复杂、初始化代码重复率高等痛点。以STC8G系列为例,传统Keil C51开发流程中,工程师需频繁翻阅PDF手册确认SFR地址与波特率计算。TraeWork智能体通过将数据手册转化为结构化知识库,结合参数代入式代码生成与自动化工作流,能显著提升串口、定时器、PWM等外设的开发效率。本文从智能体在单片机场景的定位出发,详解知识库搭建、工作流节点设计、Keil工程细节及实战排障案例,展示如何将LED控制、串口通信、ADC采样等任务标准化为可复用的技能链

weixin_34037173的博客 344

驯服电源尖峰:从BUCK/BOOST环路剖析到高di/dt噪声的实战抑制

本文深入探讨了电源系统中高di/dt噪声的产生机制及抑制方法,通过BUCK/BOOST电路的环路分析,揭示了电流路径不连续导致的电压尖峰问题。文章提供了实用的PCB布局技巧和噪声抑制策略,包括最短回路原则、铺铜优化和过孔阵列战术,帮助工程师有效降低EMI噪声,提升电源系统的稳定性。

weixin_29587015的博客 273

什么是多态?

概念:同样的引用调用同样的方法却做了不同的事 代码:

qq_46053026的博客 299

网易CodeWave智能生成应用实战:5分钟搞定库存管理系统(附详细配置截图)

本文详细介绍了如何利用网易CodeWave智能生成应用在5分钟内快速构建定制化库存管理系统。通过自然语言描述需求,无需编程即可生成包含产品管理、库存预警等核心功能的应用,并支持字段微调、业务流程注入等深度优化。文章附有详细配置截图,帮助用户高效实现数字化转型。

julia4scientist的博客 886

开源PACS系统Orthanc(DICOM服务器)配置

PACS(Picture Archiving and Communication System)是医学影像的数字化存储、检索和传输系统,用于管理和存储医学图像和相关信息,如放射学、核医学、超声、病理学等各种医学影像。PACS系统通过数字化技术取代了传统的胶片方式,使医疗机构能够更高效地存储、传输和查看医学图像,从而提高了医疗图像的管理和工作流程。

qq_42231043的博客 6249

Java设计模式——状态模式(STATE PATTERN)

场景一 描述:现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城市可以纵向延伸,向空中伸展。汽车对城市的发展我们就不说了,电梯,你想想看,如果没有电梯,每天你需要爬10 层楼梯,你是不是会崩溃掉?建筑师设计了一个没有电梯的建筑,那投资家肯定不愿意投资,那也是建筑

http://itzones.cn 1万+

手把手教你学Simulink--四翼无人机滑模控制器设计与仿真

四翼无人机(Quadcopter)滑模控制(Sliding Mode Control, SMC)是一种鲁棒性很强的非线性控制方法,特别适用于存在模型不确定性和外部扰动的情况。滑模控制器通过强制系统状态进入并保持在一个预定义的滑模面上,从而实现对期望轨迹或姿态的精确跟踪。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个基于滑模控制策略的四翼无人机系统。

MHD0815的博客 184

JAVA多态(超详细讲解)

目录 多态的基本介绍: 实现多态的条件: 1.继承:必须要有子类继承父类的继承关系。 2.重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。 3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。 JAVA面向对象编程有三大特性:封装、继承、多态。 在我们学习了继承后,我们将继续学习多态。 多态的基本介绍: 这里引用下其他地方的解释。 所谓多态就是指程序中定义的引用变量所指向的具体类型.

m0_56107268的博客 5万+

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

[SV]SystemVerilog状态机实现案例

本文介绍了SystemVerilog中状态机的实现方法。首先使用枚举类型定义状态(TOP_HIB、TOP_BG、TOP_LDO、TOP_NOR),然后通过三个主要任务实现状态机:1)格式化现态寄存器处理状态转换;2)描述状态转移条件,包括计时器和稳定时间判断;3)基于当前状态和输入信号确定次态。状态机在时钟边沿或复位时更新状态,实现了从休眠到正常工作状态的转换逻辑,包含电源稳定时间检测等关键功能。

元直的博客 2020

Java 高级特性: Lambda 表达式

前几天发表了本文的图片版,本文原来是在 word 编写的,后来想要发布到开源中国的博客,为了图方便,就直接截图上传到博客了。很多朋友看了之后留言,想要文字版的。本文篇幅非常长,把文字整理到博客真的非常费时。还好终于整理好了,献给你们,希望对你们有帮助。 本文源代码上传到了码云...

chengju2300的博客 574

华为云物联网系统开发(纯云端)外包方案及项目需求说明书

提供一个详细的需求文档(SRS,Software Requirements Specification),用于指导完全零基础的非专业负责人外包兼职专业技术人员开发一款基于华为云物联网平台、Astro低代码平台和Astro Canvas大屏设计的物联网系统,纯软件实现并支持下载部署。文档涵盖详细的软硬件组成清单(聚焦软件和云服务)、技术文档要求等,确保非专业人员在移交后能够复用、扩展和操作该系统。本文档简洁、全面,适合非技术背景的管理者使用,并基于华为云生态的内部实施部署。

hy行者勇哥的博客 620

Java:多态乃幸福本源,两分钟带你弄懂

01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变;一个二郎神,也能七十二变;他们都可以变成不同的形态,但只需要悄悄地喊一声“变”。 Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果。和孙悟空和二郎神都只需要喊一声“变”,然后就变了,并且每次变得还不一样;一个道理。 多态的前提条件有三个: 子类继承父类 子类覆盖父类的方法

rexuejava的博客 275

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java:多态乃幸福本源 侵立删

01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变;一个二郎神,也能七十二变;他们都可以变成不同的形态,但只需要悄悄地喊一声“变”。 Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果。和孙悟空和二郎神都只需要喊一声“变”...

心神沫沫的收藏 155

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java多态天涯明月笙_Java:多态乃幸福本源

01 多态是什么在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变;一个二郎神,也能七十二变;他们都可以变成不同的形态,但只需要悄悄地喊一声“变”。Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果。和孙悟空和二郎神都只需要喊一声“变”,然后就...

weixin_35805266的博客 172

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java中多态问题详解

用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解。多态的存在有三个前提: 1.要有继承关系 2.子类要重写父类的方法 3.父类引用指向子类对, 但是其中又有很多细节需要注意。首先我们定义两个类,一个父类Animal,一个子类Cat。 以上的三段代码充分体现了多态的三个前提,即: 1、存在继承关系 Cat...

lilong329329的博客 903

java 多态_Java基础之:谈谈多态

概述我们都知道面向对象有四个基本特性:抽象、封装、继承、多态。这四个特性,概括起来可以这么理解,抽象、封装、继承是多态的基础,多态是抽象、封装、继承的表现。多态,是Java中非常重要的一个部分,所以今天来谈一下多态(Polymorphism)。什么是多态不同类的对象对同一消息作出不同的响应就叫做多态。就像上课铃响了,上体育课的学生跑到操场上站好,上语文课的学生在教室里坐好一样。多态的作用简单讲就是...

weixin_39535349的博客 65

java 多态---花木兰

(注---此文非原创,是网上看到感觉,写得好复制转载过来的。感谢原创作者!) 用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解。多态的存在有三个前提: 1.要有继承关系 2.子类要重写父类的方法 3.父类引用指向子类对, 但是其中又有很多细节需要注意。首先我们定义两个类,一个父类Animal,一个子类Cat。 ...

qq_36266692的博客 908

java多态深入理解面试_最直观的解释Java的多态,看完记住一辈子!面试必备

用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解。多态的存在有三个前提:1.要有继承关系2.子类要重写父类的方法3.父类引用指向子类对,但是其中又有很多细节需要注意。首先我们定义两个类,一个父类Animal,一个子类Cat。以上的三段代码充分体现了多态的三个前提,即:1、存在继承关系Cat类继承了Animal类2、子类要重写父类的...

weixin_35677065的博客 303

java中访问修饰符,多态

1 java中的访问修饰符 1 表格 修饰符 本类 本包其他类(子类) 子类(本项目) 其他包 访问权限 public √ √ √ √ 公用的(对任何人都可以用) protect √ √ √ × 受保护的(子类及本类和本类中方法都可以) default √ √ × × 默认的(不用写,仅本包中可用) private √ × × × 私有的(本类及本类中方法可用) 2...

rukang0912的博客 247

封装、继承、多态和抽象(日常开发常用)

Java的四个基本特性:封装、继承、多态和抽象 (1)抽象:将一类对象的共同特征总结出来,然后构造成类的过程(包括数据抽象和行为抽象)。抽象只关注对象的属性和行为,不关注行为的细节。 (2)封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义好的接口。 好处:【1】保证数据的安全性,防止调用者随意更改数据。(例如,我们在封装一些常用的工具类时,会把类的无参构造器私有化或者在类名前使用abstract修饰,不准创建该类,达到只能调用,不能修改的效果) 【2】提高代码的复用性。(把..

心有谦谦结 1245
上一篇: Java登陆验证码的实现流程
下一篇: Struts2错误:org.apache.struts2.dispatcher.Dispatcher - Exception occurred during processing request
Roger_CoderLife
博客等级 码龄9年 211粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值