代码扩展:
- 通过继承,派生类(或子类)可以访问和使用基类中的所有成员变量和方法。
- 派生类可以根据需要扩展这些成员,添加新的变量和方法以创建更具体的实现。
- 这避免了在派生类中重复编写公共代码,从而简化了维护和更新。
代码重用:
- 继承促进了代码重用,通过允许派生类使用基类中定义的公共接口。
- 这减少了代码冗余,提高了应用程序的可维护性和可扩展性。
- 更改基类中的代码会自动反映在所有派生类中,简化了错误修复和功能增强。
示例:
考虑一个抽象类 Shape,它为所有形状定义基本的几何属性和方法。我们可以从 Shape 派生出不同的形状,例如 Circle、Square 和 Triangle。
// Shape 类
abstract class Shape {
private int x;
private int y;
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
public abstract double getArea();
}
// Circle 类
class Circle extends Shape {
private double radius;
public Circle(int x, int y, double radius) {
super(x, y);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
通过继承,Circle 类可以访问和使用 Shape 中定义的 x 和 y 坐标。它还可以通过覆盖 getArea() 方法提供自己独特的面积计算。
好处:
- 代码扩展:Circle 类可以轻松扩展 Shape 类,添加 radius 变量和计算面积的方法。
- 代码重用:Circle 类重用了 Shape 类中定义的坐标管理代码,避免了重复。
- 维护简化:如果 Shape 类中的坐标管理代码需要更改,Circle 类会自动继承这些更改,简化了维护。
局限性:
- 多重继承: Java 不支持多重继承(从多个基类继承),这可能会限制在某些情况下重用代码。
- 耦合: 派生类与基类紧密耦合,因此对基类的更改可能会影响派生类。
- 僵化: 派生类无法修改基类的实现,这可能会限制灵活性。
最佳实践:
- 只在需要时使用继承,避免过度继承。
- 优先考虑组合而不是继承,以获得更好的灵活性。
- 使用接口进行松散耦合,允许类实现多个接口而无需继承它们。
- 谨慎使用抽象类,以避免创建难以实例化的类层次结构。