【Java】Java面向对象编程三大特征详解
本文将给出以下内容:Java 面向对象编程三大特征(封装、继承、多态),不仅给出 源码/字节码实现原理,还会总结出 三大特性的优点(为什么 Java 必须要这样设计)。
Java 面向对象编程三大特征详解
一、封装(Encapsulation)
1. 概念
封装就是 把数据和操作数据的方法绑定在一起,并通过访问修饰符来控制外部的访问权限。
核心思想:隐藏实现细节,只暴露必要接口。
2. Java 语法层面的实现
private:私有字段,外部不可直接访问。public方法:提供受控访问。
public class User {
private String name; // 封装字段
private int age;
public String getName() {
return name;
}
public void setAge(int age) {
if (age >= 0) {
this.age = age; // 合法性检查
}
}
}
3. JVM 层面原理
- Java 类在编译后,字段的修饰符(
private、public等)会被写入 字节码常量池。 - JVM 在运行时通过 访问检查机制 限制非法访问。
- 如果类外部直接访问
private字段,JVM 验证阶段就会抛IllegalAccessError。
(可通过 javap -v User.class 查看字段访问标志:private, ACC_PRIVATE)。
4. 封装的优点
- 安全性:防止外部随意修改内部数据。
- 灵活性:通过 setter 方法可以添加参数检查、日志、懒加载等逻辑。
- 可维护性:对外接口不变,内部实现可替换。
二、继承(Inheritance)
1. 概念
继承是 代码复用机制,允许子类继承父类的属性和方法,子类还可以 扩展新功能 或 重写父类方法。
2. Java 语法层面的实现
class Person {
protected String name;
public void sayHello() {
System.out.println("Hello, I'm " + name);
}
}
class Student extends Person {
private String school;
@Override
public void sayHello() {
System.out.println("Hello, I'm " + name + " from " + school);
}
}
3. JVM 层面原理
-
方法表(vtable)机制
- 类加载时,JVM 会为类生成方法表。
- 如果子类没有重写父类方法,方法表复用父类指针。
- 如果子类重写方法,方法表中的方法指针被替换为子类实现。
-
字节码指令
invokespecial:调用构造器、私有方法、父类方法。invokevirtual:普通实例方法调用(支持多态)。
查看字节码(javap -c Student.class):
invokevirtual #4 // Method Student.sayHello:()V
这里就是继承体系中方法调用的核心。
4. 继承的优点
- 代码复用:减少重复代码。
- 层次化设计:建立通用的父类,扩展出不同的子类。
- 可扩展性:新增子类时,可以保持已有逻辑不变。
三、多态(Polymorphism)
1. 概念
多态是指 相同的消息,不同的对象有不同的响应方式。
Java 的多态包括:
- 编译期多态(方法重载 Overloading) → 静态分派。
- 运行期多态(方法重写 Overriding) → 动态分派。
2. Java 示例
(1)编译期多态(重载)
class Calculator {
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
}
在编译时由 参数类型和个数 决定调用哪个方法。
(2)运行期多态(重写)
Person p = new Student();
p.sayHello(); // 实际执行 Student.sayHello()
- 编译时:
p静态类型是Person。 - 运行时:对象实际类型是
Student。
3. JVM 层面原理
- invokevirtual 指令:运行时根据对象实际类型选择方法。
- 虚方法表(vtable):对象的类加载时会生成 vtable,存储每个虚方法的入口地址。
- 调用时,JVM 通过对象头找到方法表,再动态分派到正确的方法实现。
4. 多态的优点
- 灵活性:调用方法时,不关心对象的具体类型。
- 可扩展性:新增子类时,无需修改已有调用逻辑。
- 解耦:使代码面向接口编程,而不是依赖具体实现。
四、三大特性优点总结
| 特性 | 核心机制 | JVM 实现 | 优点 |
|---|---|---|---|
| 封装 | 访问修饰符、getter/setter | 字节码访问控制、Verifier 验证 | 数据安全、隐藏实现、提高可维护性 |
| 继承 | extends 关键字 | 方法表(vtable)、invokespecial | 代码复用、层次化设计、可扩展性 |
| 多态 | 方法重载/重写 | invokevirtual、动态分派 | 灵活调用、面向接口编程、可扩展性 |
✨ 可以看到,Java OOP 三大特征不仅仅是语法层面的“糖”,而是与 编译器(javac)、字节码(ClassFile)、JVM 方法区/虚方法表机制 深度绑定的,背后是完整的 设计哲学 + 执行原理。

本文来自博客园,作者:NeoLshu,转载请注明原文链接:https://www.cnblogs.com/neolshu/p/19513693

浙公网安备 33010602011771号