java面试:了解抽象类与接口么?讲一讲它们的区别

在java中抽象类与接口是在开发过程非常常用的两个类型,我们常常会发现很难区分这两类型,或者会发现有很多设计上的问题,因此面试过程当中无论是校招或者社招,都不免会提问到这两个类型,都是java在设计程序时十分重要的思想,今天小编就和大家来分享一下这方面的知识。

1.接口的基本概念和规范

接口是一种完全抽象的类型,它只定义方法的签名,不包含实现。接口定义了一组行为规范,实现类必须遵循这些规范,也就是定义了能做什么,接口有以下几个特性。

  • 所有方法默认是 public abstract(Java 8 之前)

  • 不能包含实例变量(只能是 public static final 常量)

  • 接口是支持多实现的

  • 接口是不能有构造方法的

由于接口是只关心行为约定,所以它不该承载实例状态,所以接口的所谓的变量天生就是常量,不过在java8之后接口就加入了default和static方法,使得接口能够进行方法的实现,这解决了 Java 接口的一个长期痛点:接口一旦发布,新增方法会导致所有实现类编译失败。

java 复制代码
// 定义接口:飞行能力
public interface Flyable {
    // 常量(默认 public static final)
    int MAX_HEIGHT = 10000;
    
    // 抽象方法(默认 public abstract)
    void fly();
    
    void land();
    
    // Java 8+ 默认方法(有实现)
    default void takeOff() {
        System.out.println("准备起飞...");
    }
}

2.抽象类的基本概念和规范

抽象类是一种部分实现的类,它可以包含抽象方法和具体方法。抽象类用于定义"是什么",用于定义行为共同特征。

  • 可以包含抽象方法和具体方法

  • 可以有实例变量、构造方法

  • 一个类只能继承一个抽象类(单继承)

  • 用于定义共同特征和默认行为

抽象类的是需要承载复用逻辑的,所以要有成员变量,有构造方法,给与类的初始化,同时抽象类一般设计用于维护某一功能,帮助由于需求不断迭代的代码维护成本。

java 复制代码
// 抽象类定义共同特征
public abstract class PaymentMethod implements Payable {
    protected String accountNo;
    protected double balance;
    
    public PaymentMethod(String accountNo, double balance) {
        this.accountNo = accountNo;
        this.balance = balance;
    }
    
    // 具体方法:检查余额
    protected boolean hasSufficientBalance(double amount) {
        return balance >= amount;
    }
    
    // 具体方法:扣款
    protected void deduct(double amount) {
        balance -= amount;
    }
}

3.接口和抽象类的区别

整理成一张表

|-------|-------------------------------------|---------------------|
| 特性 | 接口(Interface) | 抽象类(Abstract Class) |
| 定义 | "能做什么"(能力、规范) | "是什么"(类别、模板) |
| 方法 | Java 8 前只能有抽象方法 Java 8+ 可有默认方法和静态方法 | 可以有抽象方法和具体方法 |
| 变量 | 只能是 public static final 常量 | 可以有各种访问修饰符的实例变量 |
| 构造方法 | 不能有 | 可以有 |
| 继承/实现 | 多实现(一个类可实现多个接口) | 单继承(一个类只能继承一个抽象类) |
| 访问修饰符 | 方法默认 public | 可以自定义访问修饰符 |
| 设计目的 | 解耦、定义规范、实现多态 | 代码复用、定义模 |

今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于了解抽象类与接口的区别的问题得到进一步的提升,在面试的时候能从容面对面试官。

相关推荐
Yuzhiyuxia3 分钟前
【AI Agent面试系列】AI Agent可观测、评测、安全相关的知识点
人工智能·安全·面试
三翼鸟数字化技术团队21 分钟前
高性能存储引擎RocksDB:原理与Java生态实践
java
SL_staff35 分钟前
JVS-APS有限产能建模的七个刚性支点:面向产线真实约束的技术实现解析
java·开源·全栈
特立独行的猫A36 分钟前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
学长毕设1 小时前
基于SpringBoot的高校后勤报修管理系统-附源码
java·spring boot·后端
特立独行的猫A1 小时前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
杨凯凡2 小时前
Spring AI RAG 实战:向量检索、租户过滤、引用溯源与防幻觉边界
java·人工智能·spring
Felven2 小时前
C. Brr Brrr Patapim
c语言·开发语言
小科先生2 小时前
Java springboot调用数据库的基本流程
java·数据库·spring boot
秋饼3 小时前
GPT-Live 全双工语音 API Java 服务端落地实战:事件协议、会话恢复与生产踩坑
java·ai·技术分享·后端开发