面试题答案
一键面试接口和抽象类在实现多继承特性方面的不同之处
- 继承结构
- 抽象类:Java 中一个类只能继承一个抽象类,因为 Java 不支持类的多继承,避免了菱形继承问题(多个父类可能有相同方法导致冲突)。抽象类可以定义成员变量、具体方法和抽象方法,子类继承抽象类后,必须实现抽象类中的抽象方法(除非子类也是抽象类)。
- 接口:一个类可以实现多个接口,通过实现多个接口,间接实现了类似多继承的效果。接口中只能定义抽象方法(Java 8 后可定义默认方法和静态方法),成员变量默认是
public static final
的,即常量。实现接口的类必须实现接口中的所有抽象方法(除非该类是抽象类)。
- 实现方式
- 抽象类:使用
extends
关键字继承抽象类。例如:
- 抽象类:使用
abstract class Animal {
public void eat() {
System.out.println("Animal is eating");
}
public abstract void move();
}
class Dog extends Animal {
@Override
public void move() {
System.out.println("Dog is running");
}
}
- 接口:使用
implements
关键字实现接口。例如:
interface Flyable {
void fly();
}
interface Swimmable {
void swim();
}
class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("Duck is flying");
}
@Override
public void swim() {
System.out.println("Duck is swimming");
}
}
利用它们实现多继承效果的示例
- 使用抽象类:虽然不能真正实现多继承,但在一定程度上可以通过继承抽象类来获得一些共性的功能和行为定义。如上述
Animal
抽象类,Dog
类继承Animal
类,获得了eat
方法的实现,同时实现了move
抽象方法。 - 使用接口:以鸟类和水生动物为例,假设有一个
Bird
类需要同时具备飞行和游泳的能力。
interface Flyable {
void fly();
}
interface Swimmable {
void swim();
}
class Bird implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("Bird is flying");
}
@Override
public void swim() {
System.out.println("Bird is swimming");
}
}
通过实现 Flyable
和 Swimmable
两个接口,Bird
类获得了两种不同来源的行为定义,实现了类似多继承的效果。