授课语音

Java 中的继承和多态

继承和多态是面向对象编程(OOP)的两个核心特性。通过继承可以实现代码复用和类的扩展,通过多态可以提高代码的灵活性和可维护性。


1. 继承(Inheritance)

1.1 什么是继承?

继承是面向对象编程中的一个重要特性,它允许一个类(子类)从另一个类(父类)中获取属性和方法,从而实现代码复用和功能扩展。

关键点:

  • extends 关键字:用于声明子类继承父类。
  • 子类可以访问父类的公共(public)和受保护(protected)成员。
  • 子类可以重写父类的方法。

1.2 继承的代码案例

父类:动物类

// 定义一个父类:动物类
class Animal {
    // 父类的属性
    protected String name;

    // 构造方法
    public Animal(String name) {
        this.name = name;
    }

    // 父类的方法
    public void eat() {
        System.out.println(name + " 正在吃东西...");
    }
}

子类:狗类

// 定义一个子类:狗类,继承自 Animal 类
class Dog extends Animal {
    // 子类的构造方法
    public Dog(String name) {
        super(name); // 调用父类构造方法
    }

    // 子类新增的方法
    public void bark() {
        System.out.println(name + " 正在汪汪叫...");
    }
}

主方法:测试继承

public class InheritanceExample {
    public static void main(String[] args) {
        // 创建一个狗对象
        Dog dog = new Dog("小黑");
        
        // 调用父类的方法
        dog.eat();
        
        // 调用子类的方法
        dog.bark();
    }
}

输出示例:

小黑 正在吃东西...
小黑 正在汪汪叫...

代码解析:

  • 子类 Dog 通过 super 调用父类的构造方法。
  • 子类不仅继承了父类的 eat 方法,还扩展了新的 bark 方法。

2. 多态(Polymorphism)

2.1 什么是多态?

多态是指同一个方法在不同对象中具有不同的表现形式。多态分为以下两种:

  1. 编译时多态(方法重载):通过方法名相同但参数不同实现。
  2. 运行时多态(方法重写):通过子类重写父类方法实现。

2.2 运行时多态的特点

  • 父类引用指向子类对象。
  • 方法调用时,会执行子类的重写方法,而不是父类的方法。
  • 多态依赖于方法的重写。

2.3 多态的代码案例

父类:动物类

// 父类:动物类
class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    // 定义一个可以被子类重写的方法
    public void makeSound() {
        System.out.println(name + " 发出声音...");
    }
}

子类:猫类和狗类

// 子类:猫类
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println(name + " 正在喵喵叫...");
    }
}

// 子类:狗类
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println(name + " 正在汪汪叫...");
    }
}

主方法:测试多态

public class PolymorphismExample {
    public static void main(String[] args) {
        // 创建动物数组
        Animal[] animals = new Animal[2];
        
        // 子类对象赋值给父类引用
        animals[0] = new Cat("小白猫");
        animals[1] = new Dog("小黑狗");

        // 通过多态调用方法
        for (Animal animal : animals) {
            animal.makeSound(); // 调用时执行子类的重写方法
        }
    }
}

输出示例:

小白猫 正在喵喵叫...
小黑狗 正在汪汪叫...

代码解析:

  • animals 是一个 Animal 类型的数组,可以存储父类和子类对象。
  • 调用 makeSound 方法时,具体执行的是子类重写的方法,而不是父类的方法。

3. 方法重载 vs 方法重写

特性 方法重载(Overloading) 方法重写(Overriding)
定义 同一个类中方法名相同,但参数列表不同。 子类中重新定义父类的同名方法。
发生阶段 编译时 运行时
参数列表 必须不同 必须相同
访问修饰符 无限制 子类方法的访问权限不能小于父类方法。
关键字 不需要 需添加 @Override 注解(推荐)。

4. 继承和多态的优缺点

4.1 优点

  • 提高代码复用性,减少冗余。
  • 提高代码的扩展性,易于维护和修改。
  • 使用多态提高代码的灵活性,能适应更多场景。

4.2 缺点

  • 可能导致类之间的耦合性增加。
  • 过度使用继承可能导致层次复杂,难以管理。
去1:1私密咨询

系列课程: