0

0

Java中多态性如何减少代码冗余

畫卷琴夢

畫卷琴夢

发布时间:2026-01-23 12:41:32

|

625人浏览过

|

来源于php中文网

原创

多态通过父类引用调用子类重写方法避免重复分支逻辑,提升扩展性。如shape抽象类定义area(),circle和rectangle各自实现,printarea(shape s)统一处理,新增子类无需修改原有代码。

java中多态性如何减少代码冗余

多态让同一段逻辑适配不同子类

Java 中多态性本身不直接“减少代码行数”,而是通过 父类引用指向子类对象,把重复的调用逻辑抽到统一位置,避免为每个子类写一套几乎相同的流程代码。关键在于:行为差异封装在子类的重写方法里,主流程只面向接口或父类编码

Shape 举例:避免 if-else 判断类型再调用

常见冗余写法是根据对象实际类型用 if (obj instanceof Circle)switch 分支调用不同方法。这种代码随子类增多而膨胀,且每次新增子类都要改原有判断逻辑。

正确做法是定义统一方法签名,在子类中各自实现:

abstract class Shape {
    abstract double area();
}
<p>class Circle extends Shape {
final double radius;
Circle(double r) { this.radius = r; }
@Override double area() { return Math.PI <em> radius </em> radius; }
}</p><p>class Rectangle extends Shape {
final double width, height;
Rectangle(double w, double h) { this.width = w; this.height = h; }
@Override double area() { return width * height; }
}</p><p>// 调用方无需知道具体类型
void printArea(Shape s) {
System.out.println("Area: " + s.area()); // 多态分发,自动调用对应子类实现
}

ArrayList<shape></shape> 集合统一处理多个子类实例

当需要批量操作不同子类型的对象时,若不用多态,就得维护多个同构集合(List<circle></circle>List<rectangle></rectangle>),并为每个写一遍循环逻辑。多态允许用一个泛型集合容纳所有子类,并复用同一段遍历+调用代码。

立即学习Java免费学习笔记(深入)”;

飞书多维表格
飞书多维表格

表格形态的AI工作流搭建工具,支持批量化的AI创作与分析任务,接入DeepSeek R1满血版

下载
  • 必须声明为 ArrayList<shape></shape>(或 List<shape></shape>),不能用 ArrayList<object></object> —— 后者丢失类型契约,编译期无法保证有 area() 方法
  • 运行时实际调用哪个 area(),由对象真实类型决定,JVM 通过虚方法表动态绑定
  • 如果子类忘记重写 area(),抽象类已强制要求实现,编译报错,不会漏逻辑

容易被忽略的边界:重载 ≠ 多态,字段访问不具多态性

新手常误以为“只要写了多个同名方法就是多态”,其实 Java 中只有 重写(override) 才触发运行时多态;重载(overload) 是编译期静态绑定,和多态无关。

另一个典型陷阱是访问字段:

class Animal { String name = "Animal"; }
class Dog extends Animal { String name = "Dog"; }
<p>Animal a = new Dog();
System.out.println(a.name); // 输出 "Animal",不是 "Dog"

字段访问看的是引用类型(Animal),不是实际类型(Dog)。多态只适用于 非 private / static / final 的实例方法调用。

真正节省冗余的地方,从来不在语法糖上,而在你不再需要为每种新类型去翻旧代码、加分支、改 if 条件——那才是多态落地后最安静的收益。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

569

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

441

2024.03.13

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

27

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1925

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号