Java的多重继承和接口

Part 1:为什么Java不让玩"多重继承"?

想象你同时继承了爸爸和妈妈的「双眼皮」基因,结果眼皮打架了 —— 这就是著名的菱形继承问题(Diamond Problem)!

// 伪代码:如果Java允许这样写
class 爸爸 {
    void 双眼皮() { System.out.println("爸爸的双眼皮"); }
}

class 妈妈 {
    void 双眼皮() { System.out.println("妈妈的双眼皮"); }
}

// ❌ 错误!Java不允许
class 你 extends 爸爸, 妈妈 { 
    // 该用爸爸的双眼皮还是妈妈的?
}

Java的设计者说
→ "多重继承太容易让代码打架了!(╯‵□′)╯"
→ "我们改用更安全的**接口(interface)**来实现类似功能!"


Part 2:接口 —— 披着羊皮的多重继承

接口的特性

  1. 纯契约书:只能定义方法签名(没有具体实现,Java 8前)
  2. 可多实现:一个类可以实现多个接口
  3. 默认方法:Java 8开始,接口可以有default方法(带实现)

代码示例

// 定义两个接口
interface 双眼皮 {
    default void 显示双眼皮() { // Java8的默认方法
        System.out.println("默认双眼皮");
    }
}

interface 高鼻梁 {
    void 显示高鼻梁();
}

// ✅ 实现多个接口
class 你 implements 双眼皮, 高鼻梁 {
    @Override
    public void 显示高鼻梁() {
        System.out.println("继承妈妈的高鼻梁");
    }
}

// 使用
public class Test {
    public static void main(String[] args) {
        你 xiaoming = new 你();
        xiaoming.显示双眼皮();  // 输出:默认双眼皮
        xiaoming.显示高鼻梁(); // 输出:继承妈妈的高鼻梁
    }
}

 


Part 3:接口 vs 抽象类

核心区别表

特性接口(interface)抽象类(abstract class)
继承方式可多实现单继承
方法实现Java8+支持默认方法可以有具体方法
成员变量默认public static final无限制
构造方法不能有可以有
设计理念"能做什么"(能力)"是什么"(本质)

使用场景

  • 选接口
    → 定义不同类别的能力(如会飞的会游泳的
    → 需要多继承时

  • 选抽象类
    → 共享代码基础结构(如动物基类)
    → 需要定义子类的共同特性


Part 4:解决冲突的秘诀

当多个接口有同名默认方法时

interface A {
    default void foo() { System.out.println("A的foo"); }
}

interface B {
    default void foo() { System.out.println("B的foo"); }
}

class C implements A, B { 
    // ❌ 编译报错!需要手动解决冲突
    @Override
    public void foo() {
        A.super.foo(); // 选择执行A的版本
    }
}

规则
→ 必须重写冲突方法
→ 用接口名.super.方法名()指定用哪个接口的实现


Part 5:实际开发中的骚操作

1. 接口多继承

接口可以继承多个其他接口!

interface 学霸 extends 会学习, 会考试, 会写论文 { 
    // 合并多个接口的要求
}

2. 接口+抽象类组合拳

interface 飞行能力 {
    void 起飞();
    void 降落();
}

abstract class 鸟类 {
    public abstract void 下蛋();
}

class 鸽子 extends 鸟类 implements 飞行能力 {
    // 必须实现所有抽象方法+接口方法
}

曼波总结

  • 🚫 Java禁止类多重继承:避免"基因冲突"
  • ✅ 用接口实现多重继承:一个类可以实现多个接口
  • ✨ 接口特性
    → 默认方法(Java8+)
    → 静态方法(Java8+)
    → 私有方法(Java9+)
  • ⚔️ 冲突解决:手动重写+指定接口版本

接口是定义"能力",抽象类是定义"本质",用对工具代码才会优雅哦!

脑图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值