【后端】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 接口)。

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

相关推荐
超级大只老咪2 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶2 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长3 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子3 小时前
JDK 安装配置
java·开发语言
星哥说事3 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink3 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII3 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home3 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
等....3 小时前
Miniconda使用
开发语言·python
zfj3213 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang