跳转到主要内容
模块 3 · 第 1 课(共 2)课程中的5/14~12 min
模块课程(1/2)

继承

继承是 OOP 的基本机制,它允许一个类(称为子类或子类)从另一个类(称为父类或超类)继承字段和方法。

这促进了代码重用并避免不必要的重复。

使用 extends 扩展类

在 Java 中,我们使用 extends 关键字来指示一个类继承另一个类:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

构造函数和 super() 关键字

如果超类具有接受参数的构造函数,则子类必须在其构造函数中使用 super(...) 作为第一个语句显式调用它:

Java
class Person {
    String name;

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

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

方法重写 (@Override)

子类可以为从超类继承的方法提供自己的特定实现。此操作称为重写(方法重写),并由 @Override 注释指示。

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

protected 修饰符

protected 访问修饰符在继承中起着关键作用。与 private 不同,private 使成员仅在同一类中可见,而 protected 允许在同一包内和所有子类访问字段和方法,即使它们驻留在不同的包中。

使用 super 访问父成员

除了调用超类构造函数之外,还可以在子类方法中使用 super 关键字来引用父类的方法或变量。当方法被重写,但您仍然想调用原始父行为时,这特别有用:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

Java中的单继承

在Java中,一个类只能扩展一个类(单继承)。不允许从多个类直接继承(多重继承);例如,class Cat extends Animal, Mammal 将导致编译错误。这种设计选择避免了称为“钻石问题”的歧义(当两个超类定义具有不同实现的相同方法时)。为了克服这个限制,Java 引入了 接口 的概念,我们将在下一个模块中探讨它。


自己尝试一下

锻炼#java.m3.l1.e1
尝试:0加载中...

通过扩展 Animal 来完成 Dog 子类。声明接受名称(字符串)的 Dog 构造函数,并使用 super(name) 将其传递给 Animal 构造函数。

正在加载编辑器...
显示提示

写 `public Dog(String name) { super(name); }` 在 Dog 类中。

3 次尝试后可用的解决方案

锻炼#java.m3.l1.e2
尝试:0加载中...

从 Animal 扩展 Dog 并重写 makeSound() 方法,以便它返回字符串 Woof 而不是 Generic Sound。使用@Override注释。

正在加载编辑器...
显示提示

在声明 `public String makeSound() { return 'Woof'; 上方写入 `@Override`; }` 里面的狗。

3 次尝试后可用的解决方案

锻炼#java.m3.l1.e3
尝试:0加载中...

声明一个扩展 Animal 的 Cat 类并重写 makeSound() 方法以返回字符串 Meow。 Animal 类已经有一个接受名称的构造函数;确保 Cat 构造函数也接受名称并将其正确传递给超类构造函数。

正在加载编辑器...
显示提示

创建扩展“Animal”的“Cat”类。声明构造函数 `public Cat(String name) { super(name); }` 并使用 `@Override` 覆盖 `makeSound()` 方法以返回 `'Meow'`。

3 次尝试后可用的解决方案