MST
星途 面试题库

面试题:Java中接口与抽象类在多继承特性上的差异

请阐述Java中接口和抽象类在实现多继承特性方面的不同之处,并举例说明如何利用它们来实现多继承的效果。
33.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

接口和抽象类在实现多继承特性方面的不同之处

  1. 继承结构
    • 抽象类:Java 中一个类只能继承一个抽象类,因为 Java 不支持类的多继承,避免了菱形继承问题(多个父类可能有相同方法导致冲突)。抽象类可以定义成员变量、具体方法和抽象方法,子类继承抽象类后,必须实现抽象类中的抽象方法(除非子类也是抽象类)。
    • 接口:一个类可以实现多个接口,通过实现多个接口,间接实现了类似多继承的效果。接口中只能定义抽象方法(Java 8 后可定义默认方法和静态方法),成员变量默认是 public static final 的,即常量。实现接口的类必须实现接口中的所有抽象方法(除非该类是抽象类)。
  2. 实现方式
    • 抽象类:使用 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");
    }
}

利用它们实现多继承效果的示例

  1. 使用抽象类:虽然不能真正实现多继承,但在一定程度上可以通过继承抽象类来获得一些共性的功能和行为定义。如上述 Animal 抽象类,Dog 类继承 Animal 类,获得了 eat 方法的实现,同时实现了 move 抽象方法。
  2. 使用接口:以鸟类和水生动物为例,假设有一个 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");
    }
}

通过实现 FlyableSwimmable 两个接口,Bird 类获得了两种不同来源的行为定义,实现了类似多继承的效果。