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

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

相关推荐
多思考少编码4 分钟前
[GESP202309 四级] 2023年9月GESP C++四级上机题题解,附带讲解视频!
开发语言·c++·算法
Crazy learner30 分钟前
C语言fgets函数详解:安全读取字符串的利器
c语言·开发语言·算法
☆致夏☆1 小时前
Maven入门到精通
java·maven
小杨同学yx1 小时前
tomcat知识点讲解
java·tomcat·firefox
小杨同学yx1 小时前
tomcat手写流程思路
java·tomcat·firefox
HW-BASE1 小时前
C语言控制语句练习题1
c语言·开发语言·单片机·算法·嵌入式·c
流星先生!1 小时前
前端小数点处理
开发语言·前端·javascript
呼啦啦圈2 小时前
get请求中文字符参数乱码问题
java·javascript
_码农121382 小时前
简单spring boot项目,之前练习的,现在好像没有达到效果
java·spring boot·后端
期待のcode2 小时前
配置Mybatis环境
java·tomcat·mybatis