当前位置: 首页 > article >正文

Java 溯本求源之基础(三十)——封装,继承与多态

一、封装(Encapsulation)

1.1 什么是封装

        封装是将对象的状态(属性)和行为(方法)封装在一起,通过限制外部访问来保护对象的内部状态。封装的核心思想是隐藏对象的实现细节,只暴露必要的接口。

1.2 封装的实现
  • 访问修饰符:通过privateprotectedpublic和默认(包级访问)来控制成员变量和方法的访问权限。
  • getter和setter方法:提供访问和修改属性的公共接口,确保数据访问的安全性和灵活性。
1.3 封装的优点
  1. 提高安全性:通过隐藏实现细节,避免外部对对象状态的非法修改。
  2. 增强灵活性:通过 getter 和 setter 方法,可以加入数据校验或扩展逻辑。
  3. 提高可维护性:内部实现可以自由修改,而不会影响外部代码。
1.4tips

         在封装的设计中,我们通常会使用getter和setter方法来修改对象的属性,Lombok注解可以进一步减少代码量,但在某些情况下,setter方法可能不仅仅是赋值操作,还涉及到数据校验、格式化或关联属性的赋值。这些复杂的操作通常不应放在setter中,因为它们会破坏类的单一职责。为了保持良好的设计,最好将这些操作提取到单独的验证或处理类中,确保setter方法仅负责状态的修改,而将其他复杂逻辑委托给专门的类或方法,当然如果是一些小公司的的情况下这么玩玩也是可以的,大公司都是有codereview的,至于设计模式则是会在后面中进行介绍。

二、继承(Inheritance)

2.1 什么是继承

继承是指一个类(子类)可以从另一个类(父类)继承属性和方法,从而复用已有的代码并扩展其功能。Java 中使用 extends 关键字实现继承。

2.2 继承的特点
  1. 单继承:Java 中一个类只能继承一个父类。
  2. 继承成员:子类继承父类的所有非私有成员(属性和方法)。
  3. 重写方法:子类可以根据需要重写父类的方法。
  4. super 关键字:用于调用父类的构造器或方法。
2.3 继承的优点
  1. 代码复用:通过继承,子类可以直接使用父类的功能,减少重复代码。
  2. 扩展性:子类可以在继承的基础上新增或重写功能。
  3. 灵活性:通过多态实现父类引用调用子类对象的特性,提升程序灵活性。
2.4 注意事项
  1. 访问权限:子类不能继承父类的私有属性和方法,但可以通过公共方法访问。
  2. 避免过度继承:过深的继承层次可能导致代码复杂度增加。
2.5tips

        在实际的业务逻辑开发中,继承和多态是我们程序员经常用到的面向对象编程特性。这主要是因为继承提供了代码复用的能力,而多态则提升了代码的灵活性和可扩展性。以下场景中继承和多态被频繁使用:

  1. 无法修改类源代码的场景
    当我们需要修改某个属性或行为,但引用的类属于外部依赖包,且我们没有代码权限时,可以通过继承该类创建子类,再结合多态的特性,用父类引用指向子类的实例,从而实现功能扩展或修改。

  2. 模板设计模式(Template Method Pattern)
    模板方法模式依赖继承,通过父类定义通用的算法骨架,子类继承父类并重写某些具体实现,从而提供灵活的扩展点。

  3. 策略模式(Strategy Pattern)
    策略模式通过继承抽象类或实现接口来封装一组可替换的算法或行为,这些算法在运行时可以通过多态动态替换,从而实现灵活的策略选择。

三、多态(Polymorphism)

3.1 什么是多态

多态是指相同的行为在不同对象中具有不同的表现形式。多态允许父类引用指向子类对象,并调用子类的重写方法,从而实现动态绑定。

3.2 多态的实现
  1. 方法重写:子类重写父类的方法。
  2. 父类引用指向子类对象:使用父类引用调用子类的重写方法。
3.3 多态的优点
  1. 灵活性:通过多态,代码可以更灵活地适应需求变化。
  2. 扩展性:新增子类时,无需修改调用代码,只需新增实现即可。
  3. 统一接口:允许不同对象以相同方式调用方法,增强代码可读性和维护性。
3.4 多态的限制
  1. 只能调用父类中定义的方法和属性:多态引用只能访问父类中声明的成员。
  2. 不能访问子类的特有方法:若需要访问子类特有方法,必须进行类型转换。

tip:

        态在 Java 开发中非常常见,但在我刚开始作为开发人员时,并没有太过注意它的存在。实际上,多态的应用贯穿了很多代码实践,比如 List<String> s = new ArrayList<>(); 这样的写法就属于多态的一种形式——父类引用指向子类对象。这使得代码更加灵活,例如可以轻松替换为 List<String> s = new LinkedList<>();,而不需要修改其他业务逻辑。

        除此之外,多态在很多设计模式中也得到了广泛应用,比如工厂模式中返回不同实现类的对象,或者策略模式中,动态选择不同算法实现的策略。这些都是多态的实际应用,通过接口或抽象类定义统一的行为规范,在运行时决定具体实现。

四、总结

        理解封装、继承和多态,是学习面向对象编程(OOP)的核心。有时在学习这些概念时,可能会因为急于求成而仅仅停留在表面,导致对其内涵和实际应用的理解不够深入。然而,这些特性不仅仅是基础概念,更是开发者理解复杂代码、特别是结合设计模式代码的关键。

        设计模式的本质正是建立在面向对象三大特性的基础上。通过封装实现模块化,保护对象的状态与行为;通过继承实现代码复用与扩展;通过多态提供灵活的行为替换。它们共同构成了编写高效、可扩展和易维护代码的核心能力。

        因此,必须深刻理解封装、继承、多态的概念及其在实际开发中的表现。只有掌握了这些核心特性,才能应对复杂的业务场景,高效地理解和改进代码,真正成为一名优秀的开发者。


http://www.kler.cn/a/456534.html

相关文章:

  • Linux Ubuntu24配置安装Java
  • 计算机网络 (8)物理层的传输方式
  • 【Redis】Redis 典型应用 - 缓存 (cache)
  • 华为消费级QLC SSD来了
  • 关于无线AP信道调整的优化(锐捷)
  • MySQL系列之数据类型(String)
  • STM32开发笔记123:使用STM32CubeProgrammer下载程序
  • 存储快照与拓扑调度
  • 软件工程三 需求获取与结构化分析方法(需求分析、功能建模、数据建模、行为建模、数据字典等)
  • 嵌入式AI STM32部署卷积神经网络的魔法棒
  • Linux上更新jar包里的某个class文件
  • OpenHarmony开发板环境搭建
  • android sqlite 数据库简单封装示例(java)
  • 优雅草科技为什么写博客---优雅草央千澈关于自己的写的文章的一些表达和描述以及——————对写博文的态度-以及为什么写博文?作用和意义?还有一些声明
  • HarmonyOS NEXT 实战之元服务:静态案例效果---电动车助手
  • Linux第99步_Linux之点亮LCD
  • MySQL和HBase的对比
  • ubuntu虚拟机中搭建python开发环境
  • Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制
  • STM32 + 移远EC800 4G通信模块数传
  • 数据可视化-16. 日历图
  • java根据Word模板实现动态填充导出
  • 【阅读记录-章节7】Build a Large Language Model (From Scratch)
  • 基于submitit实现Python函数的集群计算
  • 【计组】例题课后题
  • AduSkin、WPF-UI、Prism:WPF 框架全解析与应用指南