【Java】深入理解封装、继承、多态:从概念到实战

大家好,我是云扬~ 今天继续分享 Java 面向对象的核心知识点 —— 封装、继承、多态。这三大特征是 Java 编程的基石,合理运用能让代码更简洁、灵活、可维护。下面结合具体代码示例,带大家深入理解每个特性的实现与应用场景。

一、引入:面向对象的核心支柱

Java 面向对象三大特征(封装、继承、多态)相辅相成:封装保证数据安全性,继承实现代码复用,多态提升扩展性。掌握这三者的设计思想,能从根本上提升代码质量。

二、封装:数据隐藏与接口暴露

封装是将数据和操作数据的方法封装为独立实体,隐藏内部实现细节,仅通过对外接口交互。

核心实现:私有属性 + 公共访问器

public class User {
    // 私有属性:隐藏内部状态
    private String username;
    private String password;
    private int age;

    // 构造方法:初始化对象
    public User(String username, String password, int age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    // 公共getter方法:安全访问属性
    public String getUsername() {
        return username;
    }

    // 公共setter方法:控制属性修改逻辑
    public void setAge(int age) {
        if (age > 0 && age  { // 数据合法性校验
            this.age = age;
        } else {
            throw new IllegalArgumentException("年龄必须在1-150之间");
        }
    }

    // 重写Object类的toString():自定义对象字符串表示
    @Override
    public String toString() {
        return "User{username='" + username + "', age=" + age + "}";
    }

    // 重写equals():基于内容比较对象
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(username, user.username);
    }
}

封装的四大优势:

  1. 减少耦合:外部仅通过接口交互,内部修改不影响外部使用
  2. 自由修改内部结构:如密码加密逻辑可在 setPassword () 中修改
  3. 精确控制成员访问:如年龄设置的合法性校验
  4. 隐藏敏感信息:密码等私有属性无法直接访问

三、继承:代码复用的 “家族树”

继承允许子类继承父类的属性和方法,子类可扩展新功能或重写父类方法。

1. 单继承实现(extends 关键字)

// 父类:抽象共性特征
public class Animal {
    protected String name;
    protected int age;

    // 父类构造方法
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 父类普通方法
    public void eat() {
        System.out.println(name + "正在进食");
    }
}

// 子类:继承父类并扩展
public class Dog extends Animal {
    // 子类特有属性
    private String breed;

    // 子类构造方法:必须先调用父类构造
    public Dog(String name, int age, String breed) {
        super(name, age); // 调用父类有参构造
        this.breed = breed;
    }

    // 重写父类方法:@Override注解校验重写正确性
    @Override
    public void eat() {
        System.out.println(name + "(" + breed + ")正在吃狗粮");
    }

    // 子类特有方法
    public void bark() {
        System.out.println(name + "汪汪叫");
    }
}

2. 多继承效果实现(接口 implements)

Java 类不支持多继承,但可通过实现多个接口间接实现:

// 定义多个接口
interface Flyable {
    void fly();
}

interface Runnable {
    void run();
}

// 类实现多个接口,需重写所有抽象方法
public class Bird extends Animal implements Flyable, Runnable {
    public Bird(String name, int age) {
        super(name, age);
    }

    @Override
    public void fly() {
        System.out.println(name + "展翅高飞");
    }

    @Override
    public void run() {
        System.out.println(name + "地面奔跑");
    }
}

3. 关键特性对比

特性代码示例
方法重写(Override)子类 Dog 重写父类 Animal 的 eat () 方法,方法名、参数、返回值完全一致
方法重载(Overload)同一类中同名不同参: add (int a, int b) ,add(double a, double b)
this 与 superthis 访问本类成员:this.name
super 访问父类成员:super.eat ()

4. 继承初始化顺序

class Parent {
    static { System.out.println("1.父类静态代码块"); }
    { System.out.println("3.父类普通代码块"); }
    public Parent() { System.out.println("4.父类构造方法"); }
}

class Child extends Parent {
    static { System.out.println("2.子类静态代码块"); }
    { System.out.println("5.子类普通代码块"); }
    public Child() { System.out.println("6.子类构造方法"); }
}

// 执行结果:1→2→3→4→5→6
public class InitOrderTest {
    public static void main(String[] args) {
        new Child();
    }
}

核心规则:静态优先(父→子)→ 普通代码块(父→子)→ 构造方法(父→子)

四、多态:同一行为的不同表现

多态是指同一方法调用,因对象类型不同产生不同执行结果,核心是动态绑定。

多态的三个必要条件:

  1. 子类继承父类
  2. 子类重写父类方法
  3. 父类引用指向子类对象

代码实现:

// 父类
public abstract class Shape {
    public abstract void draw(); // 抽象方法:定义规范
}

// 子类1
public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

// 子类2
public class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

// 多态测试
public class PolymorphismTest {
    public static void main(String[] args) {
        Shape shape1 = new Circle(); // 向上转型:父类引用指向子类对象
        Shape shape2 = new Rectangle();
        
        shape1.draw(); // 输出:绘制圆形(执行子类实现)
        shape2.draw(); // 输出:绘制矩形(执行子类实现)
        
        // 向下转型:需先判断类型
        if (shape1 instanceof Circle) {
            Circle circle = (Circle) shape1;
            // 调用子类特有方法
        }
    }
}

多态的优势:

  • 扩展性强:新增三角形(Triangle)类无需修改原有代码
  • 降低耦合:调用方仅依赖父类接口,不关心具体实现
  • 代码简洁:统一调用方式,减少重复代码

五、修饰符与三大特征的关系

修饰符作用场景
final1. 修饰类:不能被继承(如 String 类)
2. 修饰方法:不能被重写
3. 修饰变量:不可修改
abstract1. 修饰类:包含抽象方法,不能实例化
2. 修饰方法:无方法体,子类必须重写
static1. 静态属性 / 方法:属于类,无需实例化即可访问 2. 静态代码块:类加载时执行一次
访问修饰符子类重写方法时,访问权限不能比父类更严格(public > protected > default > private)

六、小结

  • 封装:隐藏细节,暴露接口(如 User 类的属性私有化)
  • 继承:子承父业,扩展功能(如 Dog 继承 Animal)
  • 多态:一接口多实现,动态绑定(如 Shape 的 draw 方法)

三大特征的核心价值在于:提高代码复用性、降低耦合度、增强扩展性。实际开发中,需结合业务场景灵活运用 —— 封装保证数据安全,继承减少重复代码,多态应对需求变化。

如果觉得本文有帮助,欢迎点赞收藏~ 后续会分享更多 Java 核心技术,咱们下期见!

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*