关于我对接口与抽象类的思考

接口与抽象类的思考

1. 接口和抽象类概述

1.1 抽象类

  • 被abstract修饰符修饰的类即为抽象类
  • 抽象类不能被实例化(即不能被new),只能被继承(extends)
  • 抽象类可以有两种类型方法:抽象方法,成员方法
    • 抽象方法:被abstract修饰的方法,不能写方法体(即连花括号{}都不能有),只能指定抽象方法的参数,返回值类型,或添加一些方法修饰符
    • 成员方法:抽象类中没有被abstract修饰的方法,相当于正常的方法,没有限制
  • 抽象方法必须在子类中被实现,所以在抽象类中不能出现:抽象构造方法和抽象静态方法
  • 子类如果没有实现父类的全部抽象方法,则这个子类必定是一个抽象类

1.2 接口

  • 接口是一个特殊的抽象类。即质保函抽象方法的抽象类
  • 通过interface关键字定义接口
  • 接口中不可以定义成员变量,但可以定义常量
  • 接口中只能定义没有被实现的抽象方法(可以忽略public abstract字段)
  • 一个类实现了某一个接口后,必须实现该接口中的所有抽象方法(注意jdk1.8前的接口只能有抽象方法,jdk1.8开始允许有被deafult修饰的成员方法在接口中)
  • 接口与接口之间也可以存在继承关系
interface test(){
    public static final int id = 100;
    public void run();
}

2. 接口和抽象类的区别

  • 定义抽象类的关键字是abstract class,而定义接口的关键字是interface
  • 继承抽象类的关键字是extends,而实现接口的关键字是implements
  • 抽象类可以只支持单继承,而接口中不可以有构造方法
  • 抽象类中可以有构造方法,而接口中不可以有构造方法
  • 抽象类中可以有成员变量,而接口中只可以有常量
  • 抽象类中可以有成员方法,而接口中只可以有抽象方法
  • 抽象类中增加方法可以不影响子类(当增加成员方法时),而接口中增加方法通常都会影响子类
  • 从jdk1.8开始,允许接口中出现非抽象方法,但需要使用default关键字修饰

3. 对接口和抽象类应用的思考

  • 有“多继承”需求时使用接口:在项目开发时,我们不难发现,根据业务需求的不同,我们总是需要用到非常多的模块,而为了降低各个模块间的依赖关系(耦合度),会为每个模块定制各自的接口进行约束,但总会有个别比较“复杂”的功能会需要不同模块的接口来对它进行约束,这时候为了减少代码冗余和提高便捷,我们就不得不同时实现多个接口,以实现一个“多继承效果”(接口叫多实现)
  • 接口的意义:和抽象方法不同,接口的内容中通常都是只是抽象方法和常量(JDK1.8开始,接口有了新的特性,可以有成员方法)。我们有过java开发经验的都知道,抽象方法时必须要被实现的,这个和继承差别很大,继承的一大用处就是为了减少代码的冗余,而接口居然要我们实现指定的方法,显然它的设计根本目的不是为了减少代码,而是为了“增加约束”,为了让我们有一个统一的规范,以保证模块间的无缝通信。总的来说,在实际开发中,带来的好处就是:①在接口设计好后,可以实现模块间分离开发;②极大降低了模块间的耦合度,便于项目维护
  • 保证接口的“静态”,新的“公共需求”尽量让抽象类来做:一旦接口确定下来后,除非逼不得已,否则不要动接口,因为抽象方法必须被实现。举个简单例子:如果给接口a添加了一个抽象方法,意味着所有实现了a接口的类都需要实现你新增加的这个抽象方法,小项目这个修改的工作量可能不大,但如果涉及到大项目,一个接口可能被implement上千次,上万次,这样,我们的工作量将会急剧增加,这是我们不可能接受的。所以,对于这个要被多个对象同时实现的公共抽象方法,应该将它交给抽象类实现,在抽象类中实现这个方法即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值