当前位置: 首页 > 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 代码中,如果我们对方法的参数、方法的返回值有硬性的要求,我们就可以将这些要求定义到某一个接口中(相当于定义了规范)

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

http://www.lryc.cn/news/440356.html

相关文章:

  • Leetcode面试经典150题-20.有效的括号
  • Git常用指令大全详解
  • 面试真题-TCP的三次握手
  • LabVIEW多语言支持优化
  • 身份证阅读器API模式 VUE Dorado7
  • 北京通州自闭症学校推荐:打造和谐学习氛围,助力孩子成长
  • openstack之cinder介绍
  • 第k个排列 - 华为OD统一考试(E卷)
  • 清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
  • 网络安全-ssrf
  • c++刷题
  • 艾丽卡的区块链英语小课堂
  • 计算机毕业设计 公寓出租系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • eclipse使用 笔记02
  • 基于C++实现(MFC)职工工作量统计系统
  • 大家好,我叫Redis~
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件
  • 网络安全学习(五)Burpsuite
  • 多版本node管理工具nvm
  • 如何扫描试卷去除笔迹?4种方法还原整洁试卷
  • 介绍⼀下泛型擦除
  • 从底层原理上理解ClickHouse 中的 Distributed 引擎
  • 社区志愿者服务系统小程序的设计
  • echarts map地图动态下钻,自定义标注,自定义tooltip弹窗【完整demo版本】
  • Python热频随机森林分类器算法模型模拟
  • C++11新增特性:lambda表达式、function包装器、bind绑定
  • 动态主题模型DTM(Dynamic topic model)简介及python代码
  • GDPU MySQL数据库 天码行空1 数据库的创建和基本操作
  • 《告别卡顿,一键卸载!IObit Uninstaller 13 免费版让电脑重获新生》
  • Python|基于Kimi大模型,实现上传文档并进行对话(5)