【后端】java 抽象类和接口的介绍和区别

文章目录

在Java中,抽象类(Abstract Class)和接口(Interface)都是实现抽象和多态的核心机制,但它们在设计目的和使用场景上有显著区别。以下是详细解释及对比:


一、抽象类(Abstract Class)

  1. 定义

    • 使用 abstract 关键字修饰,不能实例化(只能被继承)。
    • 可以包含普通方法、抽象方法、成员变量、构造方法等。
    • 抽象方法使用 abstract 声明,无方法体(需子类实现)。
  2. 核心特点

    java 复制代码
    public abstract class Animal {
        private String name; // 成员变量
    
        public Animal(String name) { 
            this.name = name; // 构造方法
        }
    
        public abstract void eat(); // 抽象方法
    
        public void sleep() { // 普通方法
            System.out.println(name + " is sleeping.");
        }
    }
  3. 关键用途

    • 代码复用 :通过继承共享基类的属性和方法(如 sleep() 方法)。
    • 强制约束 :要求子类必须实现抽象方法(如 eat())。
    • 模板模式:定义算法框架,子类填充细节。
  4. 继承规则

    • 单继承限制 :一个子类只能继承一个抽象类。

二、接口(Interface)

  1. 定义

    • Java 8 前:只能包含抽象方法 和常量 (public static final)。
    • Java 8+:支持 default 方法、static 方法、private 方法。
    • Java 9+:支持 private static 方法。
  2. 核心特点

    java 复制代码
    public interface Flyable {
        int MAX_HEIGHT = 10000; // 常量(默认为 public static final)
    
        void fly(); // 抽象方法(默认为 public abstract)
    
        // Java 8+ 默认方法(有实现)
        default void glide() {
            System.out.println("Gliding...");
        }
    
        // Java 8+ 静态方法
        static boolean isFlyable(Object obj) {
            return obj instanceof Flyable;
        }
    }
  3. 关键用途

    • 行为契约 :定义对象能做什么 (如 Flyable 表示"可飞行")。
    • 解耦设计:实现类只需关注方法逻辑,不绑定继承关系。
    • 多继承支持 :一个类可实现多个接口(解决单继承局限)。
  4. 实现规则

    • 类使用 implements 实现接口(可同时实现多个)。

三、核心区别总结

特性 抽象类 接口
方法实现 可包含普通方法和抽象方法 Java 8 前只能有抽象方法;之后支持默认/静态方法
成员变量 可以是普通变量 只能是常量(public static final)
构造方法 有构造方法(供子类调用) 无构造方法
继承/实现 单继承(子类 extends 一个抽象类) 多继承(类 implements 多个接口)
设计目的 代码复用 + 扩展约束(is-a 关系) 行为抽象(has-a/can-do 能力)
访问修饰符 抽象方法可为 protected 方法默认为 public(不可修改)
静态/私有方法 支持 Java 8+ 支持静态/默认方法;9+ 支持私有方法

四、使用场景对比

  • 用抽象类当 :

    多个子类有共享逻辑或状态 (如动物基类的 name 属性和 sleep() 方法)。

  • 用接口当 :

    需定义跨类别的行为 (如 Flyable、Runnable),或需要多继承时。

实际应用:

  • InputStream 是抽象类(提供通用读取方法,子类如 FileInputStream)。
  • List 是接口(ArrayList 和 LinkedList 提供不同实现)。

五、从设计思想理解

  • 抽象类 :描述对象的本质 ("是什么"),如 Bird extends Animal。
  • 接口 :描述对象的能力 ("能做什么"),如 Bird implements Flyable。

最佳实践

优先使用接口 (灵活解耦),当需要复用代码或共享状态时再使用抽象类。

常见组合:接口定义行为,抽象类提供部分实现(如 AbstractList 实现 List 接口)。

通过理解二者差异,可以更精准地选择工具,构建高扩展性的代码结构。

相关推荐
bmxy小明同学7 分钟前
2026-10-09-token与成本
java·前端·数据库
jimy116 分钟前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
爱吃提升25 分钟前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++
夜晚回家31 分钟前
Python 原始字符串详解 | r 前缀到底让什么不再转义
开发语言·python
陈年老古董37 分钟前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm
看浪的路人41 分钟前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang
微笑的曙光1 小时前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
iCxhust1 小时前
Matlab求解发电机的极限切除角
开发语言·算法·matlab·电力系统
zhanghaha13141 小时前
Qt 类完整例程【逐词拆解 + 逐步骤执行保姆教程】
开发语言·qt
java资料站1 小时前
七、Spring AI Alibaba · Skills
java·后端·spring