一、封装(Encapsulation)
1.1 什么是封装
封装是将对象的状态(属性)和行为(方法)封装在一起,通过限制外部访问来保护对象的内部状态。封装的核心思想是隐藏对象的实现细节,只暴露必要的接口。
1.2 封装的实现
- 访问修饰符 :通过
private
、protected
、public
和默认(包级访问)来控制成员变量和方法的访问权限。 - getter和setter方法:提供访问和修改属性的公共接口,确保数据访问的安全性和灵活性。
1.3 封装的优点
- 提高安全性:通过隐藏实现细节,避免外部对对象状态的非法修改。
- 增强灵活性:通过 getter 和 setter 方法,可以加入数据校验或扩展逻辑。
- 提高可维护性:内部实现可以自由修改,而不会影响外部代码。
1.4tips
在封装的设计中,我们通常会使用getter和setter方法来修改对象的属性,Lombok注解可以进一步减少代码量,但在某些情况下,setter方法可能不仅仅是赋值操作,还涉及到数据校验、格式化或关联属性的赋值。这些复杂的操作通常不应放在setter中,因为它们会破坏类的单一职责。为了保持良好的设计,最好将这些操作提取到单独的验证或处理类中,确保setter方法仅负责状态的修改,而将其他复杂逻辑委托给专门的类或方法,当然如果是一些小公司的的情况下这么玩玩也是可以的,大公司都是有codereview的,至于设计模式则是会在后面中进行介绍。
二、继承(Inheritance)
2.1 什么是继承
继承是指一个类(子类)可以从另一个类(父类)继承属性和方法,从而复用已有的代码并扩展其功能。Java 中使用 extends
关键字实现继承。
2.2 继承的特点
- 单继承:Java 中一个类只能继承一个父类。
- 继承成员:子类继承父类的所有非私有成员(属性和方法)。
- 重写方法:子类可以根据需要重写父类的方法。
super
关键字:用于调用父类的构造器或方法。
2.3 继承的优点
- 代码复用:通过继承,子类可以直接使用父类的功能,减少重复代码。
- 扩展性:子类可以在继承的基础上新增或重写功能。
- 灵活性:通过多态实现父类引用调用子类对象的特性,提升程序灵活性。
2.4 注意事项
- 访问权限:子类不能继承父类的私有属性和方法,但可以通过公共方法访问。
- 避免过度继承:过深的继承层次可能导致代码复杂度增加。
2.5tips
在实际的业务逻辑开发中,继承和多态是我们程序员经常用到的面向对象编程特性。这主要是因为继承提供了代码复用的能力,而多态则提升了代码的灵活性和可扩展性。以下场景中继承和多态被频繁使用:
-
无法修改类源代码的场景
当我们需要修改某个属性或行为,但引用的类属于外部依赖包,且我们没有代码权限时,可以通过继承该类创建子类,再结合多态的特性,用父类引用指向子类的实例,从而实现功能扩展或修改。
-
模板设计模式(Template Method Pattern)
模板方法模式依赖继承,通过父类定义通用的算法骨架,子类继承父类并重写某些具体实现,从而提供灵活的扩展点。
-
策略模式(Strategy Pattern)
策略模式通过继承抽象类或实现接口来封装一组可替换的算法或行为,这些算法在运行时可以通过多态动态替换,从而实现灵活的策略选择。
三、多态(Polymorphism)
3.1 什么是多态
多态是指相同的行为在不同对象中具有不同的表现形式。多态允许父类引用指向子类对象,并调用子类的重写方法,从而实现动态绑定。
3.2 多态的实现
- 方法重写:子类重写父类的方法。
- 父类引用指向子类对象:使用父类引用调用子类的重写方法。
3.3 多态的优点
- 灵活性:通过多态,代码可以更灵活地适应需求变化。
- 扩展性:新增子类时,无需修改调用代码,只需新增实现即可。
- 统一接口:允许不同对象以相同方式调用方法,增强代码可读性和维护性。
3.4 多态的限制
- 只能调用父类中定义的方法和属性:多态引用只能访问父类中声明的成员。
- 不能访问子类的特有方法:若需要访问子类特有方法,必须进行类型转换。
tip:
态在 Java 开发中非常常见,但在我刚开始作为开发人员时,并没有太过注意它的存在。实际上,多态的应用贯穿了很多代码实践,比如 List<String> s = new ArrayList<>();
这样的写法就属于多态的一种形式------父类引用指向子类对象 。这使得代码更加灵活,例如可以轻松替换为 List<String> s = new LinkedList<>();
,而不需要修改其他业务逻辑。
除此之外,多态在很多设计模式中也得到了广泛应用,比如工厂模式 中返回不同实现类的对象,或者策略模式中,动态选择不同算法实现的策略。这些都是多态的实际应用,通过接口或抽象类定义统一的行为规范,在运行时决定具体实现。
四、总结
理解封装、继承和多态,是学习面向对象编程(OOP)的核心。有时在学习这些概念时,可能会因为急于求成而仅仅停留在表面,导致对其内涵和实际应用的理解不够深入。然而,这些特性不仅仅是基础概念,更是开发者理解复杂代码、特别是结合设计模式代码的关键。
设计模式的本质正是建立在面向对象三大特性的基础上。通过封装 实现模块化,保护对象的状态与行为;通过继承 实现代码复用与扩展;通过多态提供灵活的行为替换。它们共同构成了编写高效、可扩展和易维护代码的核心能力。
因此,必须深刻理解封装、继承、多态的概念及其在实际开发中的表现。只有掌握了这些核心特性,才能应对复杂的业务场景,高效地理解和改进代码,真正成为一名优秀的开发者。