【面试问题】Java 接口与抽象类的区别

引言

在 Java 面向对象编程中,接口(Interface)和抽象类(Abstract Class)是两个重要的抽象工具。它们都能定义未实现的方法,但设计目标和使用场景截然不同。本文将通过语法、特性和实际案例,深入解析两者的核心区别。

一、基础概念回顾

抽象类(Abstract Class)

  • 定义:使用 abstract 关键字声明的类,包含抽象方法(无实现)和具体方法(有实现)。
  • 特点
    • 不能被实例化,必须通过子类继承(extends)。
    • 子类必须实现所有抽象方法(除非子类也是抽象类)。
    • 可以包含构造方法、成员变量和非抽象方法。

接口(Interface)

  • 定义:使用 interface 关键字声明,默认所有方法都是抽象的(Java 8 之前)。
  • 特点
    • 不能被实例化,必须通过类实现(implements)或接口继承(extends)。
    • 实现类必须实现所有接口方法(除非是抽象类)。
    • 成员变量默认是 public static final(常量)。
    • Java 8 后支持默认方法(default)和静态方法。

二、核心差异对比

1. 语法层面

特性抽象类接口
关键字abstract classinterface
构造方法支持(用于初始化子类)不支持
方法类型抽象方法(abstract)+ 具体方法抽象方法(默认 public abstract)+ 默认方法(Java 8+)
成员变量支持任意类型(实例 / 静态)只能是 public static final 常量
继承 / 实现单继承(extends多实现(implements
访问修饰符任意(public/protected/default方法默认 public,不可修改

2. 设计目标

  • 抽象类
    表示 “is-a”关系,用于提取同类事物的公共行为 。例如:Animal 抽象类包含 eat() 抽象方法和 sleep() 具体方法,子类(如 DogCat)继承并扩展。

    abstract class Animal {protected String name;public Animal(String name) { this.name = name; }abstract void eat(); // 抽象方法public void sleep() { // 具体方法System.out.println(name + " is sleeping.");}
    }
    
  • 接口
    表示 “can-do”关系,定义行为契约 ,与具体实现解耦。例如:Flyable 接口定义 fly() 方法,适用于 BirdAirplane 等不相关类。

    interface Flyable {void fly(); // 默认 public abstractdefault void takeOff() { // Java 8 默认方法System.out.println("Preparing to fly...");}
    }
    

3. 多态支持

  • 抽象类:单继承,子类继承父类的实现和状态。
  • 接口:多实现,类可以实现多个接口,灵活组合行为(解决 Java 单继承的局限性)。

4. 版本兼容性

  • 抽象类:修改抽象类的方法时,子类可能需要重构(强耦合)。
  • 接口:Java 8 引入默认方法后,新增方法不影响已有实现类(向后兼容)。

三、使用场景建议

场景描述推荐选择原因
提取同类事物的公共属性和行为抽象类继承机制保证代码复用
定义跨类的通用行为契约接口多实现支持解耦
需要强制实现某些方法,同时提供默认实现接口(默认方法)灵活扩展,兼容旧代码
表示 “模板” 设计(如模板方法模式)抽象类具体方法定义流程,抽象方法由子类实现

四、实战案例:交通工具设计

抽象类:Vehicle(公共属性:速度)

abstract class Vehicle {protected int speed;public Vehicle(int speed) { this.speed = speed; }abstract void start(); // 抽象方法:启动逻辑public void stop() { // 具体方法:通用停止逻辑System.out.println("Stopping... Speed: " + speed);}
}

接口:ElectricPowered(行为契约:充电)

interface ElectricPowered {void charge(); // 充电行为
}

实现类:ElectricCar

class ElectricCar extends Vehicle implements ElectricPowered {public ElectricCar(int speed) { super(speed); }@Overridevoid start() { // 实现抽象方法System.out.println("Electric car started. Speed: " + speed);}@Overridepublic void charge() { // 实现接口方法System.out.println("Charging...");}
}

五、总结:选择的核心原则

维度抽象类接口
关系继承(is-a)实现(can-do)
代码复用强(继承状态和实现)弱(仅契约,无实现复用)
灵活性低(单继承)高(多实现)
设计约束部分抽象(可包含具体方法)完全抽象(Java 8 前)
最佳实践模板设计、公共逻辑抽取行为契约、功能组合

口诀
“抽象类是模板,接口是契约;
继承用抽象类,行为用接口。”

六、区别汇总

抽象类接口
继承与实现子类使用extends关键字来继承抽象类。 只能继承1个抽象类。子类使用关键字implements来实现接口。 可以实现多个接口。
构造方法可以有构造方法。不能有构造方法。
普通方法允许有普通方法。所有方法都必须是抽象的。 (JDK8后允许使用default、static定义非抽象方法)
成员变量允许有成员变量。只允许有常量(public static final类型)。
访问修饰符抽象方法可以是:public、protected抽象方法只能是public。 默认为public abstract
main方法可以有main方法并且我们可以运行它。没有main方法,因此我们不能运行它。
设计理念被继承体现的是:”is a”的关系。 抽象类中定义的是该继承体系的共性功能。被实现体现的是:”like a”的关系。 接口中定义的是该继承体系的扩展功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36193.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【知识】Graph Sparsification、Graph Coarsening、Graph Condensation的详细介绍和对比

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 1. 理论基础(Definitions & Theoretical Background) 2. 算法方法(Techniques & Algorithms&#x…

Java单元测试、Junit、断言、单元测试常见注解、单元测试Maven依赖范围、Maven常见问题解决方法

一. 测试 1. 测试:是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程 2. 阶段划分:单元测试、集成测试、系统测试、验收测试。 ① 单元测试:对软件的基本组成单位进行测试,最小测试单位;目的检验软件基本组…

【Notepad】Notepad优化笔记AutoHotkey语法高亮\设置替换默认的notepad程序\设置主题\增加返回上一个编辑地方插件

Npp使用优化笔记 AHK或自定义语法高亮设置替换系统默认的notepad设置主题返回上一次编辑的地方插件使用 AHK或自定义语法高亮 具体参考该论坛 https://www.autohotkey.com/boards/viewtopic.php?t50 设置替换默认的notepad程序 参考文章: https://www.winhelpo…

Mac:Maven 下载+安装+环境配置(详细讲解)

📌 下载 Maven 下载地址:https://maven.apache.org/download.cgi 📌 无需安装 Apache官网下载 Maven 压缩包,无需安装,下载解压后放到自己指定目录下即可。 按我自己的习惯,我会在用户 jane 目录下新建…

[K!nd4SUS 2025] Crypto

最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上,完成5/6,最后一个网站也上不去不弄了。 Matrices Matrices Matrices 这个是不是叫LWE呀,名词忘了,但意思还是知道。 b a*s e 这里的e是高斯分成,用1000…

学习threejs,构建THREE.ParametricGeometry参数化函数生成几何体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ParametricGeometry1…

Canal 解析与 Spring Boot 整合实战

一、Canal 简介 1.1 Canal 是什么? Canal 是阿里巴巴开源的一款基于 MySQL 数据库增量日志解析(Binlog)中间件,它模拟 MySQL 的从机(Slave)行为,监听 MySQL 主机的二进制日志(Binl…

【海螺AI视频】蓝耘智算 | AI视频新浪潮:蓝耘MaaS与海螺AI视频创作体验

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…

Prometheus使用

介绍:Prometheus 是一个开源的 监控与告警系统,主要用于采集和存储时间序列数据(Time Series Data) Prometheus的自定义查询语言PromQL Metric类型 为了能够帮助用户理解和区分这些不同监控指标之间的差异,Prometheu…

Linux 文件操作-标准IO函数3- fread读取、fwrite写入、 fprintf向文件写入格式化数据、fscanf逐行读取格式化数据的验证

目录 1. fread 从文件中读取数据 1.1 读取次数 每次读取字节数 < 原内容字节数 1.2 读取次数 每次读取字节数 > 原内容字节数 2.fwrite 向文件中写入数据 2.1写入字符串验证 2.2写入结构体验证 3. fprintf 将数据写入到指定文件 4. fscanf 从文件中逐行读取内容…

再学:abi编码 地址类型与底层调用

目录 1.内置全局变量及函数 2.abi 3.地址类型 4.transfer 1.内置全局变量及函数 2.abi data就是abi编码 abi描述&#xff1a;以json格式表明有什么方法 3.地址类型 4.transfer x.transfer:合约转给x call 和 delegatecall 是 Solidity 中用于底层合约调用的函数&#xff0…

解决前端文字超高度有滚动条的情况下padding失效(el-scrollbar)使用

<div class"detailsBlocksContent"><div>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试…

SpringCloud 学习笔记3(OpenFeign)

OpenFeign 微服务之间的通信方式&#xff0c;通常有两种&#xff1a;RPC 和 HTTP。 简言之&#xff0c;RPC 就是像调用本地方法一样调用远程方法。 在 SpringCloud 中&#xff0c;默认是使用 HTTP 来进行微服务的通信&#xff0c;最常用的实现形式有两种&#xff1a; RestTem…

c中<string.h>

常见错误与最佳实践 缓冲区溢出&#xff1a; strcpy 和 strcat 不检查目标缓冲区大小&#xff0c;需手动确保空间足够。替代方案&#xff1a;使用 strncpy 和 strncat&#xff0c;或动态分配内存&#xff08;如 malloc&#xff09;。 未终止的字符串&#xff1a; 确保字符串以…

C++动态规划从入门到精通

一、动态规划基础概念详解 什么是动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题&#xff1a; 最优子结构&…

TypeScript + Vue:类风格组件如何引领前端新潮流?

&#x1f680; TypeScript Vue&#xff1a;用类风格组件打造“假货比对”神器&#xff01;&#x1f31f; 2025 年&#xff0c;前端开发早已进入“类型安全 模块化”的黄金时代。TypeScript (TS) 的类风格组件正在席卷 Vue 社区&#xff0c;为开发者带来更优雅、更强大的编码体…

Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例

Odoo 18 中的 视图应用实例 在 Odoo 中&#xff0c;视图是用户界面中表示业务对象的重要组成部分。无论您是扩展现有功能还是创建全新的功能&#xff0c;业务对象都至关重要。这些对象通过不同类型的视图向用户展示&#xff0c;而 Odoo 会根据 XML 描述动态生成这些视图。 列…

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…

Golang开发

Golang 文章目录 Golang预备技术一、算法与数据结构第1章&#xff1a;基础算法第2章&#xff1a;数据结构第3章&#xff1a;搜索与图论第4章&#xff1a;数论第5章&#xff1a;动态规划第6章&#xff1a;贪心第7章&#xff1a;算法竞赛入门 二、Linux操作系统与Shell编程三、计…

AI +低代码平台实现个性化用户体验设计

目录 一、引言 二、低代码平台与用户体验现状 &#xff08;一&#xff09;低代码平台的普及与应用 &#xff08;二&#xff09;传统低代码平台用户体验的局限性 三、AI 在个性化用户体验设计中的关键作用 &#xff08;一&#xff09;用户行为分析与洞察 &#xff08;二&a…