0

0

Java中如何使用继承结构实现开闭原则

P粉602998670

P粉602998670

发布时间:2025-10-03 22:48:02

|

976人浏览过

|

来源于php中文网

原创

开闭原则指对扩展开放、对修改关闭,通过继承与多态实现。例如,Shape抽象类派生Rectangle、Circle等子类,新增Triangle无需修改已有类;结合多态,AreaCalculator可计算任意Shape子类面积而无需改动代码;模板方法模式中,DataProcessor定义处理流程,子类重写handleData实现差异化,新增类型只需扩展子类,符合开闭原则。

java中如何使用继承结构实现开闭原则

在Java中,开闭原则(Open/Closed Principle)指的是对扩展开放,对修改关闭。也就是说,当系统需要新增功能时,应通过添加新代码来实现,而不是修改已有代码。继承结构是实现这一原则的有效手段之一。

利用继承扩展功能而不修改原有类

通过定义一个基类或抽象类表示通用行为,子类可以继承并重写方法以提供新的实现,这样在不改动原有逻辑的前提下完成功能扩展。

例如,有一个图形类体系:

abstract class Shape {
    abstract double area();
}

class Rectangle extends Shape { private double width, height;

Rectangle(double width, double height) {
    this.width = width;
    this.height = height;
}

@Override
double area() {
    return width * height;
}

}

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

class Circle extends Shape { private double radius;

Circle(double radius) {
    this.radius = radius;
}

@Override
double area() {
    return Math.PI * radius * radius;
}

}

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

如果需要增加三角形的面积计算,只需新增Triangle类继承Shape,无需修改已有的Rectangle或Circle类,也无需改动使用Shape的地方。

Bika.ai
Bika.ai

打造您的AI智能体员工团队

下载

结合多态支持运行时扩展

在调用方代码中,使用父类引用处理所有子类型对象,这样新增子类不会影响现有流程。

class AreaCalculator {
    public double calculateTotalArea(List shapes) {
        return shapes.stream().mapToDouble(Shape::area).sum();
    }
}

无论后续添加多少种图形,只要它们继承自Shape并实现area方法,calculateTotalArea方法都不需要修改,完全符合开闭原则。

使用模板方法模式进一步强化设计

在父类中定义算法骨架,将可变部分留给子类实现,也是一种基于继承的开闭原则实践。

abstract class DataProcessor {
    // 模板方法
    public final void process() {
        readData();
        parseData();
        handleData();     // 可变步骤由子类实现
        saveResult();
    }
private void readData() { /* 通用实现 */ }
private void parseData() { /* 通用实现 */ }
private void saveResult() { /* 通用实现 */ }

protected abstract void handleData();

}

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

class ImageDataProcessor extends DataProcessor { @Override protected void handleData() { System.out.println("处理图像数据"); } }

class TextDataProcessor extends DataProcessor { @Override protected void handleData() { System.out.println("处理文本数据"); } }

新增数据处理类型时,只需添加新的子类,无需修改模板方法和已有类。

基本上就这些。通过合理使用继承与多态,Java程序可以在不修改已有代码的情况下支持新功能,真正实现“对扩展开放,对修改关闭”。关键在于抽象出稳定接口或基类,并让变化的部分通过子类来体现。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

15

2025.11.27

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

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

15

2025.11.27

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

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

15

2025.11.27

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

93

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

102

2025.10.23

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2023.11.23

java中void的含义
java中void的含义

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

98

2025.11.27

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

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

1126

2023.10.19

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

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

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.8万人学习

Java 教程
Java 教程

共578课时 | 52.6万人学习

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

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