Java 初学者必看:接口 vs 抽象类,到底有什么区别?

Java 初学者必看:接口 vs 抽象类,到底有什么区别?

你是不是也曾在学习 Java 的时候,被接口和抽象类搞得一头雾水?它们看起来都能定义方法、都不能直接实例化,那到底该用哪个?今天我们就用最通俗的方式,帮你彻底搞懂!

一、 举个栗子:开一家奶茶店

想象你要开一家"统一标准"的奶茶连锁店:

  • 所有分店都必须提供「珍珠奶茶」;
  • 但每家店可以根据当地口味,决定加不加椰果、布丁等配料;
  • 同时,所有分店都要遵守总部制定的「服务规范」,比如必须微笑服务、必须30秒内出杯......

这个时候,你就需要两种"模板":

  1. 抽象类:定义通用功能 + 可选实现(比如默认微笑服务);
  2. 接口:只规定"必须做什么",不关心怎么做(比如必须提供珍珠奶茶)。

二、什么是抽象类?

复制代码
abstract class 奶茶店 {
    // 已经实现的方法(通用逻辑)
    public void 微笑服务() {
        System.out.println("欢迎光临!");
    }

    // 抽象方法(子类必须实现)
    public abstract void 制作珍珠奶茶();
}

特点:

  • 用 abstract 关键字声明;
  • 可以有 普通方法 (带实现)和 抽象方法(无实现);
  • 子类用 extends 继承,且 只能继承一个 抽象类;
  • 可以有构造器、成员变量、静态方法等。

三、 什么是接口?

复制代码
interface 饮品标准 {
    // 默认是 public static final 的常量
    int 最低温度 = 0;

    // 默认是 public abstract 的方法(Java 8+ 支持 default 方法)
    void 提供珍珠奶茶();

    // Java 8 起可以有默认实现
    default void 快速出杯() {
        System.out.println("30秒内完成!");
    }
}

特点:

  • 用 interface 声明;
  • 方法默认是 public abstract(不能有方法体,除非是 default 或 static);
  • 类用 implements 实现接口,可以实现多个接口;
  • 不能有构造器,不能有实例变量(只有常量)。

四、核心区别对比表

特性 抽象类 接口
关键字 abstract class interface
继承/实现方式 extends(单继承) implements(多实现)
方法实现 可部分实现 Java 8 前不能实现;8+ 可用 default
成员变量 可以有各种变量 只能有 public static final 常量
构造器 有 无
设计目的 "是什么"关系 "能做什么"关系

五、 什么时候用哪个?

  • 用抽象类 :当你有一组紧密相关的类,它们共享很多代码逻辑(比如动物类都有"呼吸"方法),但某些行为需要子类自己定义。

  • 用接口 :当你想定义一种能力或契约,多个不相关的类都可以具备(比如"会飞"这个能力,鸟、飞机、超人都可以实现)。

记住一句话:
抽象类是"模板",接口是"协议"。

六、 思考题

思考一下:下面场景该用接口还是抽象类?

  1. 定义"交通工具",都有"启动"和"停止"方法,但电动车和燃油车实现不同。
  2. 定义"可支付"功能,手机、手表、POS机都能支付。

答案:

1 → 抽象类(因为都是交通工具,有共性)

2 → 接口(不同设备,只要具备"支付"能力即可)

相关推荐
AI你一生一世3 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
布莱克6053 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
云-缩影4 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
LabVIEW开发4 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
瑞克-桑切斯4 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
benchmark_cc4 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
Zenova EdgeOS5 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是6 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing036 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)7 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift