模块课程(1/2)
继承
继承是 OOP 的基本机制,它允许一个类(称为子类或子类)从另一个类(称为父类或超类)继承字段和方法。
这促进了代码重用并避免不必要的重复。
使用 extends 扩展类
在 Java 中,我们使用 extends 关键字来指示一个类继承另一个类:
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(...) 作为第一个语句显式调用它:
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 注释指示。
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 关键字来引用父类的方法或变量。当方法被重写,但您仍然想调用原始父行为时,这特别有用:
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 引入了 接口 的概念,我们将在下一个模块中探讨它。
自己尝试一下
通过扩展 Animal 来完成 Dog 子类。声明接受名称(字符串)的 Dog 构造函数,并使用 super(name) 将其传递给 Animal 构造函数。
显示提示
写 `public Dog(String name) { super(name); }` 在 Dog 类中。
3 次尝试后可用的解决方案
从 Animal 扩展 Dog 并重写 makeSound() 方法,以便它返回字符串 Woof 而不是 Generic Sound。使用@Override注释。
显示提示
在声明 `public String makeSound() { return 'Woof'; 上方写入 `@Override`; }` 里面的狗。
3 次尝试后可用的解决方案
声明一个扩展 Animal 的 Cat 类并重写 makeSound() 方法以返回字符串 Meow。 Animal 类已经有一个接受名称的构造函数;确保 Cat 构造函数也接受名称并将其正确传递给超类构造函数。
显示提示
创建扩展“Animal”的“Cat”类。声明构造函数 `public Cat(String name) { super(name); }` 并使用 `@Override` 覆盖 `makeSound()` 方法以返回 `'Meow'`。
3 次尝试后可用的解决方案