Administrator
Administrator
发布于 2025-09-18 / 7 阅读
0
0

Java 面向对象编程四大核心特性:封装、继承、多态与抽象

Java 面向对象编程四大核心特性:封装、继承、多态与抽象

明年暑期就得实习了,现在得开始准备八股了,在这里记录一下

Java 作为一门经典的面向对象编程(Object-Oriented Programming, OOP)语言,其强大之处根植于几大核心特性。理解并熟练运用这些特性,是编写出高质量、可维护、易扩展代码的关键。本文将深入探讨 Java 的三大基本特性——封装、继承、多态,以及同样重要的抽象概念。

1. 封装 (Encapsulation)

封装是指将类的属性(数据)和操作这些属性的方法(行为)结合成一个独立的、内聚的整体,并对外隐藏内部的实现细节。

作用

  • 提高安全性:通过控制逻辑(如在 setter 方法中检查参数)保护内部数据,防止无效或非法的修改。
  • 降低耦合度:对外只暴露稳定的公共方法(API)。即使内部实现发生巨大变化,只要公共方法不变,调用方就无需修改代码,增强了代码的灵活性和可维护性。
  • 隐藏复杂性:将复杂的逻辑封装在方法中,外部调用时无需关心细节,简化使用流程。

Java 如何实现

主要通过访问控制修饰符来实现。通常将属性设为 private,然后提供 public 的 getter 和 setter 方法作为唯一的访问入口。

2. 继承 (Inheritance)

继承允许一个类(子类)获取另一个类(父类)的属性和方法,并可以在此基础上添加新的属性或方法,或重写父类的方法以满足自身需求。

作用

  • 代码复用:子类可以直接使用父类已定义的属性和方法,避免重复编写相同代码,减少冗余。
  • 便于扩展:子类可以在父类基础上添加新的属性或方法,快速扩展功能,无需修改父类代码。
  • 形成层次结构:通过继承可以构建类的层次关系(如 “生物 → 动物 → 哺乳动物 → 狗”),使代码结构更清晰,符合现实世界的分类逻辑。
  • 多态基础:继承是实现多态的前提,子类对象可以被当作父类对象使用,提高代码的灵活性。

如何实现

  • 关键字:使用 extends 关键字来实现。
  • 单继承:一个重要的特点是,Java 只支持单继承(一个子类只能有一个直接父类),但可以通过接口 (implements) 实现类似多重继承的效果。
  • 继承范围:子类默认继承父类的非私有(publicprotected)属性和方法;private 成员因封装性无法直接继承(需通过父类的公共方法访问)。
  • 方法重写:子类可以重写父类的方法(方法名、参数列表、返回值类型需与父类一致),以实现子类特有的逻辑。
  • 引用父类:通过 super 关键字可以在子类中调用父类的构造方法、属性或方法。

3. 多态 (Polymorphism)

字面意思是“多种形态”。它指的是父类引用指向子类对象时,调用同一个方法会根据子类对象的实际类型而执行不同的操作。这是面向对象编程最核心的特性之一。

作用

为了提高代码的可扩展性和灵活性。它允许我们编写通用的代码来处理不同类型的对象,当需要增加新的子类时,无需修改现有代码,只需让新类继承并重写相应方法即可。这遵循了“对扩展开放,对修改关闭”的设计原则。

实现三大前提

  1. 继承:在多态中必须存在有继承关系的子类和父类。
  2. 方法重写:子类重新实现父类的方法。
  3. 父类引用指向子类对象:例如 Animal myDog = new Dog();

编译时多态 vs. 运行时多态

  • 编译时多态(静态多态)
    它指的是方法重载 (Overloading)。发生在同一个类中(或父子类中),多个方法拥有相同的名称,但参数列表(参数类型、个数、顺序)不同。编译器会根据调用时传入的参数,在编译阶段就确定要调用的具体方法。

  • 运行时多态(动态多态)
    它指的是方法重写 (Overriding)。基于继承(或接口实现),子类重写父类的方法后,用父类类型的引用指向子类对象(即 “向上转型”)。调用方法时,编译器只能检查该方法是否在父类中存在,但具体执行哪个子类的重写方法,要在运行时根据对象的实际类型才能确定。

4. 抽象 (Abstraction)

除了以上三个核心特性,OOP 还有一个非常重要的概念——抽象。

抽象是忽略事物的次要细节,只提取和保留与问题相关的本质特征,从而简化复杂系统的建模过程。

作用

  • 聚焦核心问题:忽略无关细节,只关注与业务相关的本质特征,避免被具体实现干扰。
  • 统一行为标准:为同类事物定义通用接口(如 “图形都能计算面积”),让不同实现类遵循相同的规范。
  • 隔离变化:抽象层(如接口)相对稳定,具体实现(子类)的变化不会影响上层代码,提高系统稳定性。
  • 便于团队协作:通过抽象定义清晰的模块边界,不同开发者可基于统一接口并行开发,减少沟通成本。

Java 如何实现

Java 通过两种方式实现抽象:抽象类 (abstract class)接口 (interface)。两者都能定义 “必须做什么”,但不强制 “具体怎么做”,将具体实现交给子类去完成。


评论