3. 什么是继承?
在面向对象编程中,继承是一个非常重要的概念,它允许我们通过扩展现有的类(即超类或父类),来创建新的类(即子类)。子类会继承超类的状态(字段)和行为(方法),并可以在此基础上添加或修改特性。这使得我们能够重用已有代码并避免重复。
举个例子,假设我们有一个 Bicycle 类,表示所有自行车的共有特性,例如速度、踏频和档位。不同类型的自行车(如山地自行车、公路自行车和双人自行车)可能在这些共有特性上有所不同,但它们也有一些独特的功能。例如,山地自行车有额外的链环,公路自行车有下拉式车把,双人自行车有两个座位和两组车把。通过继承,我们可以让这些不同类型的自行车类共享 Bicycle 类的通用代码,同时添加它们各自独特的功能。
继承的工作原理
在这个例子中,我们可以通过让 MountainBike、RoadBike 和 TandemBike 继承 Bicycle 类,来实现这一点。所有这三种自行车类型都会拥有 Bicycle 类中的字段和方法,而不需要在每个类中重复这些代码。
在 Java 中,创建一个继承类的语法如下:
class MountainBike extends Bicycle {
// 新的字段和方法,定义山地自行车的独特功能
}
这段代码的含义是,MountainBike 类将继承 Bicycle 类的所有字段和方法。这样,MountainBike 类就具有了与 Bicycle 类相同的速度、踏频和档位等特性,同时它还可以添加或修改属于山地自行车特有的功能。
继承的好处
- 代码重用:通过继承,子类可以重用父类的代码,这样就避免了代码的重复。比如,所有自行车共享的功能只需要在
Bicycle类中编写一次,子类可以直接继承使用。 - 提高可维护性:如果需要修改共享的功能,只需修改父类的代码,所有子类都会自动继承到这些变化,减少了重复修改的工作量。
- 增强可读性:子类的代码可以专注于独特功能,而不需要再编写共有功能,从而使得代码更加简洁明了。
继承的例子
假设我们现在有一个 Bicycle 类,它包含了通用的自行车特性。我们可以通过继承来创建不同类型的自行车:
class Bicycle {
int cadence = 0; // 踏频
int speed = 0; // 速度
int gear = 1; // 档位
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
}
}
class MountainBike extends Bicycle {
int seatHeight; // 新增的字段,定义山地自行车的特性
// 新方法,定义山地自行车的独特功能
void setSeatHeight(int newValue) {
seatHeight = newValue;
}
}
class RoadBike extends Bicycle {
boolean dropHandlebars; // 新增的字段,定义公路自行车的特性
void setDropHandlebars(boolean newValue) {
dropHandlebars = newValue;
}
}
class TandemBike extends Bicycle {
int numSeats; // 新增的字段,定义双人自行车的特性
void setNumSeats(int newValue) {
numSeats = newValue;
}
}
在这个例子中,MountainBike、RoadBike 和 TandemBike 都继承了 Bicycle 类的状态(如速度、踏频、档位等)和行为(如加速、刹车、换档等)。同时,它们分别定义了各自特有的功能,如山地自行车的座椅高度、公路自行车的下拉把手、双人自行车的座位数量。
总结
继承是一种强大的面向对象编程机制,它允许你通过创建子类来继承父类的属性和行为,并为子类添加特有的功能。这样,你可以在代码中重用已定义的功能,减少重复代码,提高可维护性和可扩展性。