Java中的类、普通类,抽象类,接口的区别

Java 中主要有 5 种类型

类型 关键字 特点
普通类 class 完整实现,可直接实例化
抽象类 abstract class 半成品,有抽象方法,不能直实例化
接口 interface 纯规范,JDK8+ 可有默认方法
枚举 enum 固定常量集合,如星期、状态
注解 @interface 元数据标记,如 @Override

快速对比

复制代码
// 普通类
public class Dog { }

// 抽象类
public abstract class Animal { }

// 接口
public interface Flyable { }

// 枚举
public enum Status { SUCCESS, FAIL }

// 注解
public @interface MyAnnotation { }

特殊说明

类型 补充
内部类 类中定义的类(成员/静态/局部/匿名)
记录类 JDK14+ record Point(int x, int y),简化数据类

一句话

最常用:普通类、抽象类、接口 ;特定场景用:枚举、注解

普通类,抽象类,接口的区别

三者核心区别

特性 普通类 抽象类 接口
关键字 class abstract class interface
实例化 ✅ 可以直接 new ❌ 不能直接 new ❌ 不能直接 new
构造方法 ✅ 有 ✅ 有(供子类调用) ❌ 没有
成员变量 任意 任意 默认 public static final(常量)
方法 全部实现 抽象方法 + 普通方法 JDK8前全抽象;JDK8+可有默认/静态方法
继承/实现 单继承 单继承 多实现
设计目的 完整功能 代码复用 + 部分规范 纯规范/能力定义

抽象类,接口的区别

接口是自上而下的设计,在功能开发初期,知道这个功能需要哪些方法,但是具体实现还不确定怎么写,就可以先把这些行为定义成接口,这就小自上而下的设计。

抽象类是自下而上的设计,在开发一段时间之后,发现几个类的逻辑很相似,代码很多重复,维护痛苦,这时候就可以把重复代码抽出来,做一个父类,让子类调用。

代码对比

java 复制代码
// 普通类:完整实现
public class Dog {
    public void eat() { System.out.println("吃东西"); }
}

// 抽象类:模板 + 部分实现
public abstract class Animal {
    protected String name;           // 实例变量
    public abstract void speak();    // 抽象方法
    public void sleep() { }          // 普通方法
}

// 接口:纯规范
public interface Flyable {
    int MAX_HEIGHT = 10000;          // 默认 public static final
    void fly();                      // 默认 public abstract
    default void land() { }          // JDK8+ 默认方法
}

使用场景

场景 选择
完整功能,直接复用 普通类
有共同代码,部分方法需子类实现 抽象类
定义能力/规范,与实现解耦 接口
需要多继承(实现多个能力) 接口

一句话

普通类 = 成品;抽象类 = 半成品模板;接口 = 能力契约。

相关推荐
JAI科研14 分钟前
Deepseek Agent Harness教程(七) | Deepseek Harness不是一个内核加一堆插件
开发语言·人工智能·深度学习·算法·自然语言处理·transformer·vllm
2601_9673387116 分钟前
尚硅谷2026尚硅谷Java全栈+Python智能体教程
java·人工智能
孙克旭_41 分钟前
单链表进阶实操:5 道常考面试题详细解析【Java 实现】
java·开发语言·数据结构·单链表
斑马1391 小时前
Linux软件编程学习笔记(五)——线程
开发语言·php
2601_961901701 小时前
SpringCloud2023集成Nacos2.4.3
java
玄昌盛不会编程1 小时前
LeetCode——2091. 从数组中移除最大值和最小值
java·算法·leetcode
Rain的Java大神之路1 小时前
如何保证接口幂等
java·经验分享·后端·面试·架构
吴声子夜歌1 小时前
Java——数组和集合(一)
java·开发语言
Jesse_EC1 小时前
一个看不见的字符——CRLF 如何让我的 Docker 初始化脚本"静默失踪"
java·后端
深念Y1 小时前
Nuxt 项目 Docker 构建:从 pnpm+node 迁移到全 bun
java·前端·docker