编辑
2025-03-03
Java
00
请注意,本文编写于 45 天前,最后修改于 45 天前,其中某些信息可能已经过时。

目录

一、封装 (Encapsulation)
定义
核心思想
作用
示例代码
二、继承 (Inheritance)
定义
核心规则
作用
示例代码
三、多态 (Polymorphism)
定义
实现方式
核心特点
示例代码
多态的应用场景
四、三者关系总结
五、常见问题

在 Java 中,封装、继承、多态 是面向对象编程(OOP)的三大核心特性。它们共同构建了代码的可维护性、复用性和灵活性。以下是详细解释和示例:


一、封装 (Encapsulation)

定义

将对象的属性和方法包装在一起,并对外隐藏实现细节,仅通过受控的接口访问数据。

核心思想

  • 数据隐藏:用 private 修饰属性,禁止直接访问。
  • 暴露接口:通过 public 的 getter/setter 方法操作属性。

作用

  • 防止不合理的数据修改(如年龄不能为负数)。
  • 降低耦合度,内部修改不影响外部调用。
  • 提高代码安全性。

示例代码

java
public class Student { private String name; private int age; // Getter 方法 public String getName() { return name; } // Setter 方法(可添加逻辑校验) public void setAge(int age) { if (age > 0) { this.age = age; } else { System.out.println("年龄无效"); } } }

二、继承 (Inheritance)

定义

子类继承父类的属性和方法,实现代码复用和层次化设计。通过 extends 关键字实现。

核心规则

  • 单继承:Java 中一个类只能有一个直接父类。
  • 构造方法:子类构造方法默认调用 super()(父类无参构造)。
  • 方法重写:子类可覆盖父类方法(需 @Override 注解)。

作用

  • 复用已有代码,避免冗余。
  • 建立类之间的层次关系(如 AnimalDog)。

示例代码

java
class Animal { void eat() { System.out.println("动物在进食"); } } class Dog extends Animal { @Override void eat() { System.out.println("狗在啃骨头"); } void bark() { System.out.println("汪汪叫"); } } // 使用 Animal dog = new Dog(); dog.eat(); // 输出:狗在啃骨头(多态) // dog.bark(); // 错误!父类引用无法调用子类特有方法

三、多态 (Polymorphism)

定义

同一操作作用于不同对象时,产生不同的行为。分为 编译时多态(方法重载)和 运行时多态(方法重写)。

实现方式

  1. 方法重写 (Override)
    子类重新定义父类的方法。
  2. 向上转型
    父类引用指向子类对象(如 Animal a = new Dog();)。
  3. 动态绑定
    JVM 在运行时根据对象实际类型调用对应方法。

核心特点

  • 消除类型之间的耦合。
  • 提高代码扩展性(如新增子类不影响原有逻辑)。

示例代码

java
class Animal { void sound() { System.out.println("动物发出声音"); } } class Cat extends Animal { @Override void sound() { System.out.println("喵喵喵"); } } class Bird extends Animal { @Override void sound() { System.out.println("叽叽喳喳"); } } // 测试多态 public class Test { public static void main(String[] args) { Animal[] animals = {new Cat(), new Bird()}; for (Animal a : animals) { a.sound(); // 同一方法,不同表现 } } }

多态的应用场景

  • 接口多态:通过实现不同接口定义行为。
  • 集合框架List list = new ArrayList();
  • 设计模式:工厂模式、策略模式等。

四、三者关系总结

特性核心目标关键实现方式
封装隐藏细节,保护数据private + getter/setter
继承代码复用,建立层次结构extends + 方法重写
多态灵活扩展,统一接口方法重写 + 向上转型

五、常见问题

  1. 封装是否必须使用 getter/setter?
    不是必须,但推荐使用以控制数据访问。

  2. 继承会继承父类的私有属性吗?
    会继承,但无法直接访问(需通过父类的公共方法)。

  3. 如何区分重载 (Overload) 和重写 (Override)?

    • 重载:同一类中,方法名相同,参数列表不同。
    • 重写:子类中,方法名、参数、返回类型与父类相同。
  4. 多态中能否调用子类特有方法?
    需要向下转型:

    java
    if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.bark(); }

掌握这三大特性,可以更高效地设计健壮的 Java 程序!

本文作者:宁小健

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!