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

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 代码中,如果我们对方法的参数、方法的返回值有硬性的要求,我们就可以将这些要求定义到某一个接口中(相当于定义了规范),让方法的参数或方法的返回值必须是实现了接口的对象

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聂 可 以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值