当前位置: 首页 > news >正文

Java中接口和抽象类的区别(语法层面的区别、设计理念层面的区别)

文章目录

  • 1. 语法层面的区别
    • 1.1 成员属性
    • 1.2 成员方法
    • 1.3 关系
  • 2. 设计理念层面的区别(重点)
  • 3. 举例理解抽象类和接口在设计理念层面的区别
    • 3.1 例一:门和警报
    • 3.2 例二:招聘
    • 3.3 例三:装修房子
  • 4. 总结

1. 语法层面的区别

1.1 成员属性

  • 抽象类:抽象类中的成员属性可以是变量,也可以是常量
  • 接口:接口中的成员属性都是常量,默认由 public static final 关键字修饰

1.2 成员方法

  • 抽象类:抽象类中的成员方法可以是具体的方法,也可以是抽象方法
  • 接口:接口中的方法都是抽象方法,默认由 public abstract 关键字修饰(当然,JDK 8 及以后允许接口中有默认方法,这不在我们的讨论范围之内)

1.3 关系

  • 类与类:一个类只能继承一个类
  • 类与接口:一个类可以实现单个或多个接口(接口不能继承类)
  • 接口和接口:一个接口可以继承一个或多个接口

2. 设计理念层面的区别(重点)

  • 抽象类:对事物的抽象,包括属性和行为
  • 接口:对行为的抽象,主要是行为

接口的设计目的是对类的行为进行约束,要求不同的类具有相同的行为,只约束行为的有无,但不限制如何实现行为

抽象类的设计目的是代码复用,当不同的类具有某些相同的属性和行为,可以让这些类都派生于一个类,在这个类中抽象出属性和行为,避免多次重复编写定义属性和行为的代码,达到代码复用的效果

正是因为行为可能没有具体实现,抽象类和接口不允许实例化,避免出现一些不可预测的情况发生


抽象类的功能大于接口,但是定义抽象类的代价很高,因为在 Java 中只能继承一个类,所以需要在抽象类中编写出所有子类的共性

接口在功能上会弱化不少,因为接口是针对某一个行为的描述,一个事物可能会有多种行为,所以一个类可以同时实现多个接口

设计抽象类的难度远远大于设计接口

3. 举例理解抽象类和接口在设计理念层面的区别

我们通过几个例子来理解抽象类和接口在设计理念层面的区别

3.1 例一:门和警报

我们知道,门都有 open 和 close 两个动作,我们分别使用抽象类和接口来定义这个抽象概念

在这里插入图片描述

目前看来,使用抽象类和接口都没有问题

随着时代的发展,某些门具备了报警的功能,我们该如何实现报警(alarm)这个功能呢


思路一: 将 open、close、alarm 三个功能都放在同一个抽象类里面

在这里插入图片描述

这样一来,所有继承了抽象类的子类都会具备报警功能,但并不是所有的门都具备报警功能,所以这个思路不好


思路二:将 open、close、alarm 三个功能都放在同一个接口里面

在这里插入图片描述

需要实现报警功能的类,就重写接口中的 alarm 方法

但实现 Door 接口后同时也要重写 open 和 close 方法,但是有一些具有报警功能的类并不具备 open 和 close 这两个功能,例如火灾报警器

思路二违反了设计模式六大基本原则中的接口隔离原则(至于什么是接口隔离原则,可以参考我的另一篇博文:设计模式的六大基本原则(开闭原则、单一职责原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特法则))


由此可见,两种思路的设计都有问题,那我们应该如何设计呢

open 和 close 是门应该具备的动作,而 alarm 是额外附加的行为,所以最好的设计思路就是将报警功能单独设计为一个接口,将 open 和 close 放到抽象类 Door 中

在这里插入图片描述

3.2 例二:招聘

假如你是一个团队的领导,那么你在招聘的时候会对应聘者会有一定的任职要求,只有满足了这些要求才能参加面试,比如:

  • 本科学历
  • 计算机相关专业
  • 熟悉 Java

这个过程就相当于我们写了一个面试的方法,同时定义了一个接口,然后将接口作为方法的参数,从而保证所有传进来的参数,也就是来面试的应聘者都需要满足任职要求

在这里插入图片描述

3.3 例三:装修房子

毛坯房:指房屋建筑主体结构完工后,没有进行室内装修的房子。毛坯房通常具备基本的水电设施,但内部没有进行墙面抹平、地面铺设、门窗安装等装修工程,不具备直接入住的条件

假如你买了一个毛坯房,打算将房子装修成自己喜欢的风格,在装修过程中你会发现,开发商给你预留好了灯座,但具体要安装什么类型的灯,需要你自己决定,这个毛坯房就相当于一个抽象类

4. 总结

接口相当于定义规范,在 Java 代码中,如果我们对方法的参数、方法的返回值有硬性的要求,我们就可以将这些要求定义到某一个接口中(相当于定义了规范)

抽象类可以理解为一个半成品,我们拿到抽象类以后,需要在抽象类的基础上缝缝补补,才能得到一个完整的成品

相关文章:

Java中接口和抽象类的区别(语法层面的区别、设计理念层面的区别)

文章目录 1. 语法层面的区别1.1 成员属性1.2 成员方法1.3 关系 2. 设计理念层面的区别(重点)3. 举例理解抽象类和接口在设计理念层面的区别3.1 例一:门和警报3.2 例二:招聘3.3 例三:装修房子 4. 总结 1. 语法层面的区别…...

Leetcode面试经典150题-20.有效的括号

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…...

Git常用指令大全详解

Git常用指令大全详解 Git,作为目前最流行的分布式版本控制系统,其强大的功能和灵活性为开发者提供了极大的便利。无论是个人项目还是团队协作,Git都扮演着不可或缺的角色。本文将详细总结Git的常用指令,帮助大家更好地掌握这一工…...

面试真题-TCP的三次握手

TCP的基础知识 TCP头部 面试题:TCP的头部是多大? TCP(传输控制协议)的头部通常是固定的20个字节长,但是根据TCP选项(Options)的不同,这个长度可以扩展。TCP头部包含了许多关键的字…...

LabVIEW多语言支持优化

遇到的LabVIEW多语言支持问题,特别是德文显示乱码以及系统区域设置导致的异常,可能是由编码问题或区域设置不匹配引起的。以下是一些可能的原因及解决方案: 问题原因: 编码问题:LabVIEW内部使用UTF-8编码,但…...

身份证阅读器API模式 VUE Dorado7

VUE 新框架 // 身份证扫描 readIdCard(type) {// 1.连接axios.get(http://localhost:19196/openDevice).then(res > {if (res.data.resultFlag 0) {// 2.读卡axios.get(http://localhost:19196/readCard).then((res) > {if (res.data.resultFlag 0) {// this.$message…...

北京通州自闭症学校推荐:打造和谐学习氛围,助力孩子成长

在北京通州,寻找一所能够全面关注自闭症儿童成长、提供高效康复服务的学校,星贝育园无疑是众多家庭的首选。作为全国知名的广泛性发育障碍全托寄宿制儿童康复训练机构,星贝育园以其专业的康复方法、强大的师资力量和贴心的服务,为…...

openstack之cinder介绍

概念 cinder 为虚拟机提供管理块存储服务。支持的文件系统:lvm、iscsi、nfs、san、RBD 组件构成及功能介绍 cinder api:在控制节点运行,管理服务的接口,被命令行、其他组件调用; cinder scheduler:类似n…...

第k个排列 - 华为OD统一考试(E卷)

2024华为OD机试(E卷D卷C卷)最新题库【超值优惠】Java/Python/C合集 题目描述 给定参数n,从1到n会有n个整数:1,2,3,.,n,这n个数字共有 n!种排列。按大小顺序升序列出所有排列情况,并-一标记,当n3时,所有排列…...

清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程

清理C盘缓存是维护电脑性能、释放磁盘空间的重要步骤。以下是一个详细且操作简单的教程,旨在帮助用户通过一键或几步操作完成C盘缓存的清理。 1.使用Windows系统自带工具 磁盘清理 1.打开磁盘清理工具: -按下“WinE”打开文件资源管理器…...

网络安全-ssrf

目录 一、环境 二、漏洞讲解 三、靶场讲解 四、可利用协议 4.1 dict协议 4.2 file协议 4.3 gopher协议 五、看一道ctf题吧(长亭的比赛) 5.1环境 5.2开始测试 ​编辑 一、环境 pikachu,这里我直接docker拉取的,我只写原…...

c++刷题

17.电话号码的组合 来源于题解思路&#xff1a; 继承 CC14 KiKi设计类继承 #include <iostream> #include <memory> using namespace std; class Shape{ private:int x;int y; };class Rectangle:public Shape { public:Rectangle(int length,int width):Shape…...

艾丽卡的区块链英语小课堂

系列文章目录 复习昨日 文章目录 系列文章目录前言1.opaque2.deduplicates3.references4,intermix5.serializing6.streamline7.robust8.flexibility9.exotic10.nevertheless11. realize12.flavor13.subtract14.attach15.award 前言 欢迎来到艾丽卡的区块链英语小课堂&#x…...

计算机毕业设计 公寓出租系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

eclipse使用 笔记02

创建一个项目&#xff1a; 【File-->New-->Dynamic Web Project】 进入页面&#xff1a; Project name为项目命名 Target runtime&#xff1a;选择自己所对应的版本 finish创建成功&#xff1a; 创建成功后的删除操作&#xff1a; 创建前端界面&#xff1a; 【注意&a…...

基于C++实现(MFC)职工工作量统计系统

题目&#xff1a;职工工作量统计系统设计 1、问题描述 职工包括姓名、职工号、性别、年龄、所在部门、联系方式等信息。 工作量包括职工号、完成的产品数量等信息。 该设计系统能够对职工的工作量进行统计&#xff0c;并排出名次。注意&#xff0c;一个职工的工作量是可以多次…...

大家好,我叫Redis~

大家好&#xff0c;我是Redis&#xff01;下面请通过我的故事来认识我吧。 1. 初次登场&#xff1a;为什么需要我 在“双十一”期间&#xff0c;商店被顾客挤得水泄不通&#xff0c;所有人都急着问&#xff1a;“这款商品还有库存吗&#xff1f;” 可怜的服务员&#xff08;My…...

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件

目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…...

网络安全学习(五)Burpsuite

经过测试&#xff0c;发现BP需要指定的JAVA才能安装。 需要的软件已经放在我的阿里云盘。 &#xff08;一&#xff09;需要下载Java SE 17.0.12(LTS) Java Downloads | Oracle 1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持 看一下是否安装成功&#xff0c…...

多版本node管理工具nvm

什么是nvm&#xff1f; 在项目开发过程中&#xff0c;使用到vue框架技术&#xff0c;需要安装node下载项目依赖&#xff0c;但经常会遇到node版本不匹配而导致无法正常下载&#xff0c;重新安装node却又很麻烦。为解决以上问题&#xff0c;nvm&#xff1a;一款node的版本管理工…...

4步完整指南:如何用OpenCore Legacy Patcher让旧Mac重获新生

4步完整指南&#xff1a;如何用OpenCore Legacy Patcher让旧Mac重获新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 想让被苹果抛弃的旧Mac电脑重新运行最…...

Nunchaku-FLUX.1-dev开源大模型部署案例:电商素材批量生成零API成本

Nunchaku-FLUX.1-dev开源大模型部署案例&#xff1a;电商素材批量生成零API成本 1. 引言 如果你正在经营一家电商店铺&#xff0c;或者从事内容创作、设计工作&#xff0c;那么对图片素材的需求一定不小。从商品主图、详情页配图&#xff0c;到社交媒体海报、广告素材&#x…...

Sketch Measure: 设计标注自动化的创新实践

Sketch Measure: 设计标注自动化的创新实践 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 在数字化产品开发流程中&#xff0c;设计稿到代码实现的转化始终…...

从LC谐振到信号振铃:用Multisim仿真带你理解PCB上的阻尼振荡

从LC谐振到信号振铃&#xff1a;用Multisim仿真揭示PCB阻尼振荡的本质 1. 振铃现象&#xff1a;硬件工程师的"噩梦" 第一次在示波器上看到信号边沿那些诡异的振荡波形时&#xff0c;我差点以为自己的电路板被某种神秘力量干扰了。这种被称为"振铃"的现象…...

vue基于springboot的目的地旅游预订网站

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分技术实现要点扩展功能建议性能优化方向项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用户模块 用户注册与登录…...

机械革命无界14X实战:用VMware 17.5给AMD 8845HS装macOS 15(附8核/16核OC引导)

机械革命无界14X实战&#xff1a;AMD 8845HS笔记本在VMware 17.5上运行macOS 15全攻略 最近不少技术爱好者都在尝试将macOS系统运行在AMD平台的笔记本上&#xff0c;尤其是搭载锐龙8845HS处理器的设备。作为一款性能强劲的移动处理器&#xff0c;8845HS配合780M核显确实具备运…...

告别天价桥接芯片!用高云GW5AT-LV15MG132 FPGA搞定MIPI C-PHY摄像头测试盒

国产FPGA革新摄像头测试方案&#xff1a;高云GW5AT-LV15MG132的MIPI C-PHY实战解析 在摄像头模组生产线上&#xff0c;测试环节的成本与效率直接关系到企业竞争力。传统测试方案依赖进口FPGA搭配昂贵桥接芯片&#xff0c;不仅物料清单&#xff08;BOM&#xff09;成本居高不下…...

Benchmark.js 配置选项终极指南:如何优化你的 JavaScript 性能测试环境

Benchmark.js 配置选项终极指南&#xff1a;如何优化你的 JavaScript 性能测试环境 【免费下载链接】benchmark.js A benchmarking library. As used on jsPerf.com. 项目地址: https://gitcode.com/gh_mirrors/be/benchmark.js Benchmark.js 是一款专业的 JavaScript 性…...

RWKV7-1.5B-g1a轻量部署方案:中小企业AI落地首选,年省GPU成本超40%

RWKV7-1.5B-g1a轻量部署方案&#xff1a;中小企业AI落地首选&#xff0c;年省GPU成本超40% 1. 为什么选择RWKV7-1.5B-g1a 在当今AI技术快速发展的背景下&#xff0c;中小企业往往面临高昂的GPU计算成本和技术门槛。rwkv7-1.5B-g1a作为一款基于RWKV-7架构的多语言文本生成模型…...

Intel XE核显PyTorch环境搭建避坑指南

1. 为什么选择Intel XE核显跑PyTorch&#xff1f; 最近很多小伙伴都在问&#xff0c;用Intel XE核显跑PyTorch到底靠不靠谱&#xff1f;作为一个在AI领域摸爬滚打多年的老司机&#xff0c;我可以很负责任地告诉你&#xff1a;完全可行&#xff01;特别是对于预算有限的学生党&a…...