Java 面向对象编程四大核心特性:封装、继承、多态与抽象
明年暑期就得实习了,现在得开始准备八股了,在这里记录一下
Java 作为一门经典的面向对象编程(Object-Oriented Programming, OOP)语言,其强大之处根植于几大核心特性。理解并熟练运用这些特性,是编写出高质量、可维护、易扩展代码的关键。本文将深入探讨 Java 的三大基本特性——封装、继承、多态,以及同样重要的抽象概念。
1. 封装 (Encapsulation)
封装是指将类的属性(数据)和操作这些属性的方法(行为)结合成一个独立的、内聚的整体,并对外隐藏内部的实现细节。
作用
- 提高安全性:通过控制逻辑(如在 setter 方法中检查参数)保护内部数据,防止无效或非法的修改。
- 降低耦合度:对外只暴露稳定的公共方法(API)。即使内部实现发生巨大变化,只要公共方法不变,调用方就无需修改代码,增强了代码的灵活性和可维护性。
- 隐藏复杂性:将复杂的逻辑封装在方法中,外部调用时无需关心细节,简化使用流程。
Java 如何实现
主要通过访问控制修饰符来实现。通常将属性设为 private,然后提供 public 的 getter 和 setter 方法作为唯一的访问入口。
2. 继承 (Inheritance)
继承允许一个类(子类)获取另一个类(父类)的属性和方法,并可以在此基础上添加新的属性或方法,或重写父类的方法以满足自身需求。
作用
- 代码复用:子类可以直接使用父类已定义的属性和方法,避免重复编写相同代码,减少冗余。
- 便于扩展:子类可以在父类基础上添加新的属性或方法,快速扩展功能,无需修改父类代码。
- 形成层次结构:通过继承可以构建类的层次关系(如 “生物 → 动物 → 哺乳动物 → 狗”),使代码结构更清晰,符合现实世界的分类逻辑。
- 多态基础:继承是实现多态的前提,子类对象可以被当作父类对象使用,提高代码的灵活性。
如何实现
- 关键字:使用
extends关键字来实现。 - 单继承:一个重要的特点是,Java 只支持单继承(一个子类只能有一个直接父类),但可以通过接口 (
implements) 实现类似多重继承的效果。 - 继承范围:子类默认继承父类的非私有(
public、protected)属性和方法;private成员因封装性无法直接继承(需通过父类的公共方法访问)。 - 方法重写:子类可以重写父类的方法(方法名、参数列表、返回值类型需与父类一致),以实现子类特有的逻辑。
- 引用父类:通过
super关键字可以在子类中调用父类的构造方法、属性或方法。
3. 多态 (Polymorphism)
字面意思是“多种形态”。它指的是父类引用指向子类对象时,调用同一个方法会根据子类对象的实际类型而执行不同的操作。这是面向对象编程最核心的特性之一。
作用
为了提高代码的可扩展性和灵活性。它允许我们编写通用的代码来处理不同类型的对象,当需要增加新的子类时,无需修改现有代码,只需让新类继承并重写相应方法即可。这遵循了“对扩展开放,对修改关闭”的设计原则。
实现三大前提
- 继承:在多态中必须存在有继承关系的子类和父类。
- 方法重写:子类重新实现父类的方法。
- 父类引用指向子类对象:例如
Animal myDog = new Dog();。
编译时多态 vs. 运行时多态
-
编译时多态(静态多态)
它指的是方法重载 (Overloading)。发生在同一个类中(或父子类中),多个方法拥有相同的名称,但参数列表(参数类型、个数、顺序)不同。编译器会根据调用时传入的参数,在编译阶段就确定要调用的具体方法。 -
运行时多态(动态多态)
它指的是方法重写 (Overriding)。基于继承(或接口实现),子类重写父类的方法后,用父类类型的引用指向子类对象(即 “向上转型”)。调用方法时,编译器只能检查该方法是否在父类中存在,但具体执行哪个子类的重写方法,要在运行时根据对象的实际类型才能确定。
4. 抽象 (Abstraction)
除了以上三个核心特性,OOP 还有一个非常重要的概念——抽象。
抽象是忽略事物的次要细节,只提取和保留与问题相关的本质特征,从而简化复杂系统的建模过程。
作用
- 聚焦核心问题:忽略无关细节,只关注与业务相关的本质特征,避免被具体实现干扰。
- 统一行为标准:为同类事物定义通用接口(如 “图形都能计算面积”),让不同实现类遵循相同的规范。
- 隔离变化:抽象层(如接口)相对稳定,具体实现(子类)的变化不会影响上层代码,提高系统稳定性。
- 便于团队协作:通过抽象定义清晰的模块边界,不同开发者可基于统一接口并行开发,减少沟通成本。
Java 如何实现
Java 通过两种方式实现抽象:抽象类 (abstract class) 和 接口 (interface)。两者都能定义 “必须做什么”,但不强制 “具体怎么做”,将具体实现交给子类去完成。