文章中如果有图看不到,可以点这里去 csdn 看看。从那边导过来的,文章太多,没法一篇篇修改好。

【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 类在编译后,字段的修饰符(privatepublic 等)会被写入 字节码常量池
  • 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 方法区/虚方法表机制 深度绑定的,背后是完整的 设计哲学 + 执行原理
在这里插入图片描述

posted @ 2025-09-30 17:42  NeoLshu  阅读(0)  评论(0)    收藏  举报  来源