Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

  • Java 8 + 特性类

    • 使用 Java 8 的优点是什么?
    • 集合与流有何不同?
    • 什么是 Lambda 表达式?
    • 解释 Predicate 和 Consumer 函数式接口
    • peek () 方法在 Java 8 中的作用?
    • 什么是函数式接口?
    • 接口中的静态方法有什么作用?
    • skip (long) 和 limit (long) 的区别?
    • 抽象类和接口的异同?
      • overload 与 override 的区别?
      • HashMap 在 Java 8 中的变化?
      • HashMap、LinkedHashMap、Hashtable、ConcurrentHashMap 的区别?
      • Lambda 参数列表与箭头运算符的作用?
      • sleep () 和 wait () 的区别?
      • throw 与 throws 的区别?
      • final、finally、finalize 的区别?
      • Collection 与 Collections 的区别
      • ArrayList、LinkedList、Vector 的区别?
    • 其他技术类

    • 常见面试题
    • Java 8 + 特性类
    刘博
    2025-12-29
    目录

    抽象类和接口的异同?

    抽象类(abstract class)和接口(interface)是 Java 中实现抽象和多态的核心机制,在 “定义、继承、方法特性” 等方面既有共性也有差异:

    # 1. 相同点

    • 均不能实例化:抽象类不能直接new,接口也不能直接new,需通过子类 / 实现类实例化;
    • 均支持抽象方法:抽象类可包含抽象方法(abstract修饰),接口默认方法为抽象方法(Java 8 前);
    • 均支持多态:子类 / 实现类可重写抽象方法,实现统一接口下的不同行为;
    • 均用于代码复用:抽象类通过继承复用代码,接口通过实现复用方法规范。

    # 2. 不同点

    对比维度 抽象类(abstract class) 接口(interface)
    继承方式 单继承(子类只能继承一个抽象类) 多实现(类可实现多个接口)
    方法特性 可包含抽象方法、普通方法、静态方法、默认方法 Java 8 前:仅抽象方法;Java 8 后:支持抽象方法、静态方法、默认方法
    字段特性 可包含任意字段(成员变量、静态变量),支持各种访问修饰符 字段默认public static final(常量),不能包含普通成员变量
    构造方法 有构造方法(用于子类初始化) 无构造方法
    访问修饰符 类:public/ 默认;方法 / 字段:任意访问修饰符 类:默认public;方法 / 字段:默认public(可省略)
    核心用途 代码复用(子类继承共性方法)+ 抽象规范 定义方法规范(多实现)+ 功能扩展(默认方法)

    # 3. 适用场景

    • 抽象类:需复用大量代码(如多个子类共享属性和方法),且子类之间存在 is-a 关系(如Dog是Animal);
    • 接口:需定义方法规范(不关心实现),且类需实现多个功能(如Bird实现Flyable和Swimmable)。

    # 示例

    java

    运行

    // 抽象类
    abstract class Animal {
        // 成员变量
        protected String name;
        
        // 构造方法
        public Animal(String name) {
            this.name = name;
        }
        
        // 普通方法(可复用)
        public void eat() {
            System.out.println(name + "在吃饭");
        }
        
        // 抽象方法(规范)
        public abstract void move();
    }
    
    // 接口
    interface Flyable {
        // 常量
        String TYPE = "飞行生物";
        
        // 抽象方法(规范)
        void fly();
        
        // 默认方法(扩展)
        default void showType() {
            System.out.println("类型:" + TYPE);
        }
    }
    
    // 子类继承抽象类+实现接口
    class Bird extends Animal implements Flyable {
        public Bird(String name) {
            super(name);
        }
        
        @Override
        public void move() {
            System.out.println(name + "在跳跃");
        }
        
        @Override
        public void fly() {
            System.out.println(name + "在飞翔");
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49

    #


    上次更新: 12/30/2025
    skip (long) 和 limit (long) 的区别?
    overload 与 override 的区别?

    ← skip (long) 和 limit (long) 的区别? overload 与 override 的区别?→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式