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 | 可以自定义访问修饰符 |
| 设计目的 | 解耦、定义规范、实现多态 | 代码复用、定义模 |

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

相关推荐
泡海椒4 分钟前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
黄敬峰6 分钟前
一文搞懂 LLM 流式输出与 SSE
面试
小智老师PMP19 分钟前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
Rain的Java大神之路1 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
自动化监测Learner1 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库
江畔柳前堤1 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
那个松鼠很眼熟w2 小时前
4.Spring-Ai入门案例
java·人工智能·spring
计算机毕设定制辅导-无忧学长2 小时前
《基于SpringBoot青年公寓出租管理系统的设计与实现》
java·vue.js·spring boot·青年公寓出租管理系统
Figo_Cheung2 小时前
Figo基于RNC理论的宇宙演化第七纪元猜想
开发语言·php
职场的momo2 小时前
字节生活服务海量内推,挑战亿级订单与AI交易中台
人工智能·程序人生·面试·职场和发展·跳槽·生活·业界资讯