【面试问题】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.mzph.cn/bicheng/73872.shtml

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

相关文章

【资料分享】全志科技T113-i全国产(1.2GHz双核A7 RISC-V)工业核心板规格书

核心板简介 创龙科技SOM-TLT113 是一款基于全志科技T113-i 双核ARM Cortex-A7 玄铁C906 RISC-V HiFi4 DSP 异构多核处理器设计的全国产工业核心板,ARM Cortex-A7 处理单元主频高达1.2GHz。核心板 CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&…

R语言高效数据处理-自定义格式EXCEL数据输出

注:以下代码均为实际数据处理中的笔记摘录,所以很零散, 将就看吧,这一篇只是代表着我还在,所以可能用处不大,这一段时间都很煎熬! 在实际数据处理中为了提升效率,将Excel报表交付给…

LeetCode 30 —— 30.串联所有单词的子串

题目: 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。 示例 1&#xff…

《算法笔记》9.2小节——数据结构专题(2)->二叉树的遍历 问题 A: 复原二叉树(同问题 C: 二叉树遍历)

题目描述 小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。 输入 输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由…

SpringBoot-2整合MyBatis以及基本的使用方法

目录 1.引入依赖 2.数据库表的创建 3.数据源的配置 4.编写pojo类 5.编写controller类 6.编写接口 7.编写接口的实现类 8.编写mapper 1.引入依赖 在pom.xml引入依赖 <!-- mysql--><dependency><groupId>com.mysql</groupId><artifac…

Unity Shader Graph高级节点逻辑设计:程序化噪声生成技术详解

一、程序化噪声的核心价值 程序化噪声生成是Shader开发中的关键核心技术&#xff0c;通过数学算法直接生成纹理信息&#xff0c;相较于传统位图纹理具有以下优势&#xff1a; 无限分辨率&#xff1a;可动态适应任意显示精度 参数化控制&#xff1a;实时调整噪声频率、振幅等属…

[蓝桥杯 2023 省 B] 飞机降落(不会dfs的看过来)

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…

英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析

【完整版】3月19日&#xff0c;黄仁勋Nvidia GTC 2025 主题演讲&#xff5c;英伟达 英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析 一、引言 1.1 分析内容 本研究主要采用了文献研究法、数据分析以及专家观点引用相结合的方法。在文献研究方面&#xff0c;广泛收集了…

强化学习 - PPO控制无人机

PPO&#xff08;Proximal Policy Optimization&#xff0c;近端策略优化&#xff09;是一种强化学习算法&#xff0c;用于训练智能体&#xff08;无人机&#xff09;如何在环境中做出决策。它本质上是 策略梯度&#xff08;Policy Gradient&#xff09;方法 的一种改进&#xf…

YOLO11报错:AttributeError: module ‘torch‘ has no attribute ‘OutOfMemoryError‘

事情是这样的&#xff1a;前几天YOLO11的代码还是可以训练的&#xff0c;昨天训练了一天&#xff0c;今天换模型就报这个错。 AttributeError: module torch has no attribute OutOfMemoryError我查了一下&#xff1a;YOLO11官方代码issues里面也有人有同样的问题&#xff0c;…

Prometheus使用

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

ESG报告评级标准解读

ESG&#xff08;环境、社会、治理&#xff09;报告评级标准用于评估企业在环境、社会和公司治理方面的表现。以下是主要评级标准的解读&#xff1a; 1. 环境&#xff08;Environmental&#xff09; 碳排放&#xff1a;评估企业的温室气体排放及减排措施。 能源使用&#xff1…

清晰易懂的 PHP 安装与配置教程

初学者也能看懂的 PHP 安装与配置教程 本教程将手把手教你如何在 Windows 系统上安装 PHP&#xff0c;并配置 Composer&#xff08;PHP 的依赖管理工具&#xff09;的缓存位置&#xff0c;即使你是零基础小白&#xff0c;也能轻松完成&#xff01; 一、准备工作 操作系统&…

Zabbix监控自动化(Zabbix Mnitoring Automation)

​​​​​​zabbix监控自动化 1、自动化监控(网络发现与自动注册只能用其一) 1.1 ansible安装zabbix agent 新采购100台服务器&#xff1a; 1、安装操作系统 2、初始化操作系统 3、安装zabbix agent 1.手动部暑 2.脚本部暑(shell expect) 3.ansible 4、纳入监控 1.…

Android Launcher3 首屏图标锁定技术方案解析

一、需求背景与技术挑战 在Android 13系统定制开发中&#xff0c;需实现Launcher首屏图标固定功能。该需求需在以下技术维度进行突破&#xff1a; 拖拽事件拦截机制&#xff1a;需精准识别拖拽目标区域 布局层级判定&#xff1a;准确识别第一屏的布局标识 跨屏操作限制&…

Spring Framework 中 BeanDefinition 是什么

BeanDefinition 是 Spring Framework 中一个核心的接口&#xff0c;它描述了一个 Bean 的定义。你可以把它看作是 Spring IoC 容器中 Bean 的“蓝图”或“配置元数据”。它包含了 Spring 容器创建、配置和管理 Bean 所需的所有信息。 BeanDefinition 中包含的信息&#xff1a;…

QtCreator16创建WebAssembly工程在浏览器中显示图片

显示效果&#xff1a; 实现过程&#xff1a; 添加qrc资源文件 输入文件名&#xff1a; 选择模板为Qt Resource File 在工程目录下创建res文件夹&#xff0c;复制图片文件到res中 编辑qrc文件 添加资源前缀 添加图片资源 选择图片资源添加别名 复制资源URL 使用别名调用资源 居…

openpnp - 如果安装面的钣金接触面不平,可以尝试加垫片

文章目录 openpnp - 如果安装面的钣金接触面不平&#xff0c;可以尝试加垫片概述吐槽备注END openpnp - 如果安装面的钣金接触面不平&#xff0c;可以尝试加垫片 概述 在X轴导轨上&#xff0c;架上百分表&#xff0c;打设备的工作平面的平面度&#xff0c;发现工作平面不平(和…

人工智能之数学基础:线性方程组

本文重点 线性方程组是由两个或两个以上的线性方程组成的方程组,其中每个方程都是关于两个或两个以上未知数的线性方程。 记忆恢复 我们先从小学学习的线性方程组找到感觉 解答过程: 将第二个方程乘以2,得到: 2x−2y=2 将第一个方程减去新得到的方程,消去x: (2x+y)−…

DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路

刚开始琢磨使用DeepSeek-R1风格训练多模态R1模型&#xff0c;就看到这个工作&#xff0c;本文一起看看&#xff0c;供参考。 先提出问题&#xff0c;仅靠 RL 是否足以激励 MLLM 的推理能力&#xff1f; 结论&#xff1a;不能&#xff0c;因为如果 RL 能有效激励推理能力&#…