接口实现多继承特性
- 原理:接口定义了一组方法签名,但没有方法的实现。一个类可以实现多个接口,从而获得多个接口中定义的行为,这就模拟了多继承,因为可以从多个接口获取不同的功能。
- 方式:使用
implements
关键字,例如:
interface Interface1 {
void method1();
}
interface Interface2 {
void method2();
}
class MyClass implements Interface1, Interface2 {
@Override
public void method1() {
// 实现 method1
}
@Override
public void method2() {
// 实现 method2
}
}
- 局限性:接口中只能定义抽象方法(Java 8 之后可定义默认方法和静态方法),不能有成员变量(除了
public static final
常量),实现接口的类必须实现接口中的所有抽象方法,这可能导致类变得臃肿。
抽象类实现多继承特性
- 原理:抽象类可以定义抽象方法和具体方法,也可以有成员变量。一个类只能继承一个抽象类,但抽象类可以通过继承其他抽象类来扩展功能,间接实现类似多继承的效果。
- 方式:使用
extends
关键字,例如:
abstract class AbstractClass1 {
abstract void method1();
}
abstract class AbstractClass2 extends AbstractClass1 {
abstract void method2();
}
class MyClass extends AbstractClass2 {
@Override
public void method1() {
// 实现 method1
}
@Override
public void method2() {
// 实现 method2
}
}
- 局限性:Java 不支持类的多继承,一个类只能继承一个抽象类,限制了从多个父类获取特性的能力。同时,抽象类中的抽象方法必须在子类中实现。
不同应用场景下的选择
- 需要实现多个无关功能:如果一个类需要获取多个不相关的行为,使用接口。例如,一个类既需要可序列化功能(
Serializable
接口),又需要可比较功能(Comparable
接口),接口能很好地满足这种需求。
- 有公共属性和行为且需要继承关系:当多个类有一些公共的属性和行为,并且存在一定的继承层次关系时,使用抽象类。例如,在图形绘制的框架中,
Shape
抽象类可以定义一些通用的属性(如颜色)和方法(如绘制方法),具体的图形类(如 Circle
、Rectangle
)继承自 Shape
抽象类。
- 希望代码复用:抽象类可以包含具体方法和成员变量,方便代码复用。如果需要在多个子类中复用一些代码逻辑,抽象类更合适。而接口主要用于定义行为契约,代码复用能力较弱。
- 对灵活性要求高:接口更灵活,因为一个类可以实现多个接口。如果未来可能需要给类添加新的功能,接口更容易扩展。而抽象类由于单继承的限制,扩展相对受限。