【后端】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() 方法)。

  • 用接口当

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

实际应用

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

五、从设计思想理解

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

最佳实践

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

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

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

相关推荐
lhldsg几秒前
树洞倾诉的核心需求与产品定位误区
java·前端·小程序
Freak嵌入式9 分钟前
MicroPython+Pico 接收空闲中断和发送空闲中断全实战
java·开发语言·stm32·单片机·嵌入式硬件
重生之小比特10 分钟前
【初阶C++】string
开发语言·c++
计算机毕设定制辅导-无忧学长22 分钟前
《基于SpringBoot的图书管理系统设计与实现》
java·spring boot·后端
小蒜学长23 分钟前
借助于大模型工具Cursor的中药材交易系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
Arvin62724 分钟前
SonarQube 扫描 Maven 项目编译错误
java·maven·sonar
小玮看世界27 分钟前
[Python]动态规划三步走:从爬楼梯到打家劫舍,再到最大子数组和
开发语言·python·动态规划
lhldsg31 分钟前
宠物同城领养平台开发实战:从需求分析到上线部署指南
java·前端·小程序·需求分析·宠物
AI视觉网奇32 分钟前
3d子部件高亮选中
开发语言·javascript·3d
风萧萧199934 分钟前
JAVA :JSONObject转换为XML
xml·java·python