这是一个非常核心且重要的 Java 概念,答案分为两个部分:

- 关于类的继承:Java 不支持多重继承。
- 关于接口的实现:一个类可以实现多个接口。
关于类的继承:为什么 Java 不支持多重继承?
在 Java 中,一个类只能使用 extends 关键字继承一个父类,这被称为单继承。
// 正确:一个类只能有一个直接父类
class Dog extends Animal {
// ...
}
// 错误!Java 编译器会报错
// class Dog extends Animal, Mammal { // 不允许
// }
为什么 Java 要这样设计?—— 避免“菱形问题”(Diamond Problem)
这是最核心的原因,多重继承会导致非常复杂的继承关系,尤其是当多个父类拥有相同的方法时,会产生歧义。
让我们来看一个经典的“菱形问题”示意图:
A (has method())
/ \
/ \
B C
\ /
\ /
D
假设:

- 类
A有一个方法public void method() {}。 - 类
B继承自A,并且重写了method()。 - 类
C也继承自A,并且也重写了method()。 - 类
D同时继承自B和C。
现在问题来了:当 D 的对象调用 method() 方法时,应该调用哪个版本?是 B 的版本还是 C 的版本?这就产生了歧义,编译器无法决定,这种冲突被称为“菱形问题”或“致命继承”(Deadly Diamond of Death)。
Java 通过禁止类的多重继承,从根本上避免了这种复杂性和歧义。
特殊情况:Object 类
在 Java 中,所有类都直接或间接地继承自 java.lang.Object 类,即使你没有写 extends Object,它也会默认存在,任何一个类都至少有一个父类。
关于接口的实现:一个类可以实现多个接口
虽然一个类不能继承多个类,但它可以实现多个接口,这是 Java 提供灵活性的重要方式。

接口定义了一组规范(方法签名),但不包含具体实现,一个类通过 implements 关键来实现一个或多个接口。
语法
class MyClass extends SuperClass implements InterfaceA, InterfaceB, InterfaceC {
// 必须实现 InterfaceA, InterfaceB, InterfaceC 中所有声明的方法
// 同时也可以继承 SuperClass 的属性和方法
}
示例
假设我们有几个接口:
interface Flyable {
void fly();
}
interface Swimmable {
void swim();
}
interface Singable {
void sing();
}
我们创建一个 Bird 类,它既能飞,又能唱歌。
class Bird {
// Bird 类自己的属性和方法
String name;
}
// 一个类可以继承一个类,同时实现多个接口
class Parrot extends Bird implements Flyable, Singable {
@Override
public void fly() {
System.out.println(name + " is flying high in the sky.");
}
@Override
public void sing() {
System.out.println(name + " is singing a beautiful song.");
}
}
// 另一个类,Duck,可以继承 Bird,实现不同的接口
class Duck extends Bird implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("A duck is flying.");
}
@Override
public void swim() {
System.out.println("A duck is swimming in the pond.");
}
}
在这个例子中:
Parrot继承了Bird的name属性,并实现了Flyable和Singable接口。Duck也继承了Bird,但实现了Flyable和Swimmable接口。- 这样既保持了单继承的清晰性,又获得了多继承带来的能力组合的灵活性。
一个类如何同时继承类和实现接口?
这是最常见的情况,Java 的规则是:extends 必须在 implements 之前。
// 语法格式
class <子类名> extends <父类名> implements <接口名1>, <接口名2>, ... {
// ...
}
示例
// 一个父类
class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
// 两个接口
interface Runnable {
void run();
}
interface Barkable {
void bark();
}
// 一个子类,继承 Animal,同时实现两个接口
class Dog extends Animal implements Runnable, Barkable {
@Override
public void run() {
System.out.println("The dog is running.");
}
@Override
public void bark() {
System.out.println("The dog is barking: Woof! Woof!");
}
}
// 测试
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // 继承自 Animal
myDog.run(); // 实现自 Runnable
myDog.bark(); // 实现自 Barkable
}
}
输出结果:
This animal eats food.
The dog is running.
The dog is barking: Woof! Woof!
| 特性 | 描述 | 关键字 | 示例 |
|---|---|---|---|
| 类的继承 | 不支持多重继承,一个类只能有一个直接父类。 | extends |
class Dog extends Animal { ... } |
| 接口的实现 | 支持多实现,一个类可以实现多个接口。 | implements |
class Duck implements Flyable, Swimmable { ... } |
| 组合使用 | 一个类可以同时继承一个类并实现多个接口。 | extends 必须在 implements 之前 |
class Parrot extends Bird implements Flyable, Singable { ... } |
核心思想: Java 通过“单继承 + 多实现”的设计模式,巧妙地解决了“菱形问题”带来的复杂性,同时保留了通过接口组合不同能力的灵活性,这是 Java 面向对象设计中的一个精髓。
