JavaSE-面向对象-抽象类和接口

🔍核心问题: abstract classinterface 该怎么选

1、抽象类:共享实现的基类

🎯 What

带有部分实现的类模板,用于定义"IS-A"关系的共同基础

本质: 共享代码和状态的骨架

⚙️ How

关键特征:有字段、构造器、具体方法、单继承

java 复制代码
abstract class Animal {
    protected String name;              // 共享状态(字段)
    public Animal(String name) {        // 共享构造逻辑
        this.name = name;
    }
    public void sleep() {               // 共享默认行为
        System.out.println(name + " sleeps");
    }
    public abstract void sound();       // 子类必须实现
}
class Dog extends Animal {              // 单继承
    public void sound() {               // 强制实现抽象方法
        System.out.println("Bark!");
    }
}

💡 Why

因为需要共享状态和行为 :当多个子类有相同的字段、构造逻辑、默认方法时,抽象类避免代码重复,确保子类遵循统一结构

设计动机:代码复用 + 类型层次统一

选择场景:需要共享状态/构造逻辑/默认实现 + 单继承关系

2、接口:能力契约的定义

🎯 What

纯行为契约 ,用于定义"CAN-DO"关系的能力标准

本质:跨类层级的能力协议

⚙️ How

java 复制代码
interface Swimmable {
    void swim();                        // 行为契约
    default void dive() {               // 可选默认实现 (Java 8+)
        System.out.println("Diving");
    }
}
class Fish implements Swimmable {      // 可多实现
    public void swim() {                // 必须实现核心契约
        System.out.println("Swimming");
    }
}
class Duck extends Animal implements Swimmable, Flyable { // 多能力
    public void swim() { System.out.println("Duck swimming"); }
}

💡 Why

因为需要解耦和多继承 :当不同类需要相同能力,但无法共享实现时,接口提供统一契约,不强制实现细节,支持一个对象具备多种能力

设计动机:行为标准化 + 灵活扩展

选择场景:跨类层级的能力定义 + 多继承需求 + 解耦设计

3、总结

💎 一句话关联

抽象类

"它是什么 " → 用继承+共享代码 构建 → 为了代码复用和统一
接口

"它能做什么 " → 用实现+契约 定义 → 为了灵活扩展和解耦

🚀 决策指南(30秒选择)

问题 → 抽象类 → 接口
需要共享字段/状态吗? ✅ 是 ❌ 否
需要构造器初始化吗? ✅ 是 ❌ 否
需要部分默认实现吗? ✅ 是 ✅ Java 8+ default方法
需要多继承能力吗? ❌ 否 ✅ 是
这是本质属性还是行为能力? 本质属性(IS-A) 行为能力(CAN-DO)
相关推荐
架构源启18 小时前
文档接入与智能解析:基于 Spring AI 1.1.x 的多格式解析、版面理解与结构化抽取
java·人工智能·spring
大模型码小白1 天前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
名字还没想好☜1 天前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
音符犹如代码1 天前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉1 天前
手撕小汇总
java·前端·javascript
唐青枫1 天前
Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
java
脱胎换骨-军哥1 天前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
我是唐青枫1 天前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio
小白说大模型1 天前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain
风起洛阳@不良使1 天前
springIOC创建对象的方式--spring容器中的注入
java·spring