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

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

相关推荐
爱学习的小可爱卢1 分钟前
Java UDP编程实战:UDP数据报套接字编程DatagramPacket、DatagramSocket 、InetSocketAddress
java·udp·udp数据报
未来之窗软件服务3 分钟前
幽冥大陆(三十五)S18酒店门锁SDK go语言——东方仙盟筑基期
java·前端·golang·智能门锁·仙盟创梦ide·东方仙盟·东方仙盟sdk
r***934821 分钟前
【Redis】在Java中以及Spring环境下操作Redis
java·redis·spring
沐知全栈开发30 分钟前
前端控制器模式
开发语言
C***115039 分钟前
对基因列表中批量的基因进行GO和KEGG注释
开发语言·数据库·golang
6***092641 分钟前
如何快速搭建简单SpringBoot项目网页
java·spring boot·intellij-idea
q***44811 小时前
spring实例化对象的几种方式(使用XML配置文件)
xml·java·spring
q***98521 小时前
Spring Boot:Java开发的神奇加速器(二)
java·spring boot·后端
x***44011 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
小蒜学长1 小时前
基于spring boot的汽车4s店管理系统(代码+数据库+LW)
java·数据库·spring boot·后端·汽车