在 Java 面向对象编程中,继承是最核心的特性之一,它能帮我们实现代码复用、简化类的设计,还能清晰描述现实世界中事物的层级关系。

以「动物世界」为案例,一步步抽象对象、提取属性行为、构建继承关系,彻底搞懂 Java 继承的用法和核心思想。这个案例包含动物(父类)、老鼠(子类)、熊猫(子类)。

一、需求分析与抽象设计

在写代码前,我们先按照面向对象的思想,把问题拆解清楚:

  1. 对象抽象:父类Animal(动物),子类Mouse(老鼠)、Panda(熊猫)
  2. 属性抽象:所有动物都有名字(name)食物(food)
  3. 行为抽象
    • 父类通用行为:吃(eat)睡觉(sleep)
    • 子类特有行为:老鼠额外拥有打洞(digHole)
  4. 继承关系MousePanda继承Animal,直接复用父类的属性和方法,无需重复编写

二、核心知识点:Java 继承基础

1. 什么是继承?

继承就是子类(派生类)继承父类(基类)的属性和方法,子类可以直接使用父类的非私有成员,还能扩展自己的特有属性和方法。

2. 继承语法

// 子类 extends 父类
public class 子类名 extends 父类名 {
    // 子类特有属性 + 方法
}

3. 继承核心特点

  • 代码复用:父类的通用代码写一次,所有子类都能使用
  • 扩展性:子类可以重写父类方法,也能添加自己的特有方法
  • 单继承:Java 中一个子类只能继承一个父类(避免多继承冲突)

三、代码实现

1. 父类:Animal(动物)

作为所有动物的父类,封装通用属性namefood,通用方法eat()sleep()

/**
 * 动物父类
 */
public class Animal {
    // 公共属性:名字、食物
    protected String name;
    protected String food;

    // 构造方法:初始化属性
    public Animal(String name, String food) {
        this.name = name;
        this.food = food;
    }

    // 吃的行为
    public void eat() {
        System.out.println(name + " 正在吃 " + food);
    }

    // 睡觉的行为
    public void sleep() {
        System.out.println(name + " 正在睡觉");
    }

    // getter/setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

✅ 关键点:使用protected修饰属性,子类可以直接访问,比private更适合继承场景。


2. 子类:Mouse(老鼠)

继承Animal,复用父类属性和方法,扩展特有方法digHole()(打洞)

/**
 * 老鼠类:继承动物类
 */
public class Mouse extends Animal {

    // 构造方法:调用父类构造方法初始化属性
    public Mouse(String name, String food) {
        super(name, food);
    }

    // 特有行为:打洞
    public void digHole() {
        System.out.println(name + " 正在打洞!");
    }
}

✅ 关键点:

  • super(参数):调用父类构造方法,必须写在子类构造方法第一行
  • 直接复用父类eat()sleep(),无需重复编写

3. 子类:Panda(熊猫)

继承Animal,纯复用父类功能,无额外扩展(演示基础继承)。

/**
 * 熊猫类:继承动物类
 */
public class Panda extends Animal {

    // 构造方法
    public Panda(String name, String food) {
        super(name, food);
    }
}

4. 测试类:TestAnimal

创建对象,调用方法,验证继承效果。

public class TestAnimal {
    public static void main(String[] args) {
        // 创建老鼠对象
        Mouse mouse = new Mouse("小老鼠", "谷物");
        mouse.eat();    // 继承父类方法
        mouse.sleep();  // 继承父类方法
        mouse.digHole(); // 子类特有方法
        System.out.println("------------------------");

        // 创建熊猫对象
        Panda panda = new Panda("大熊猫", "竹子");
        panda.eat();    // 继承父类方法
        panda.sleep();  // 继承父类方法
    }
}

运行结果

小老鼠 正在吃 谷物
小老鼠 正在睡觉
小老鼠 正在打洞!
------------------------
大熊猫 正在吃 竹子
大熊猫 正在睡觉

四、案例核心知识点总结

1. 继承的好处

  1. 代码复用:父类写一次eat()sleep(),所有子类都能使用,减少冗余代码
  2. 结构清晰:完美模拟现实世界的层级关系(动物→老鼠 / 熊猫)
  3. 易于扩展:新增子类只需继承父类,新增通用功能只需修改父类

2. 关键语法

  • 继承关键字:extends
  • 调用父类构造:super()
  • 访问权限:protected(父类子类同包可用,适合继承)
  • 方法复用:子类直接调用父类非私有方法

3. 注意事项

  • Java 只支持单继承,一个子类不能同时继承多个父类
  • 子类不能继承父类的private属性和方法
  • 子类可以重写父类方法(覆盖),实现自己的逻辑

更多推荐