理解Abstract class和Interface

随声附和 提交于 2020-03-04 10:10:47

前言 

  • 在Java中,实现 抽象的机制有2种抽象类(abstract class)接口(Interface)
  • 二者非常类似,甚至可相互替换,因此很多开发者开发时对于二者的选择十分随意。其实,2者之间存在很大区别
  • 本文将对抽象类(abstract class)、接口(Interface)  之间的区别 进行详细 讲解剖析

抽象是什么

抽象就是忽略与当前目标无关的相关方面,以便更充分地突出与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。 抽象体(即被Abstract和Interface定义的抽象事物)在实际编程中定义一类行为,却不对其做实际的描述,在继承或者实现中才涉及到具体的实现,也就是说,抽象体隐藏了具体的实现,而仅仅提供统一的接口,在实际实现中可以根据需要进行实现或者扩展。这符合面向对象设计原则中的"对修改封闭,对扩展开放"的原则

语法和实践上的区别

  • 抽象类主要是类对象的抽象集合
  • 抽象方法主要是类方法的抽象集合
  Abstract Class Interface
实例化 不能 不能
是一种继承关系,一个类智能使用一次继承关系。
可以通过继承多个接口实现多重继承
一个类可以实现多个接口
数据成员 可以有自己的 必须是默认的static final
方法成员 可以有私有方法,有非abstract方法,如果有abstract方法,
子类必须实现,否则也必须是abstract的 
默认是public abstract类型
设计理念 表示的”is-a”关系 表示是”like-a”关系
集成和抽象 需要继承,要用extends关键字 implements关键字
应用 主要在代码实现方面发挥作用,用于实现代码的重用  主要在架构设计方面发挥作用,主要用于
定义模块间的通信契约
(依赖倒转原则)

    abstract class和interface在使用上最大的区别应当是IS A 和 LIKE A 的区别,继承一个抽象类表示是什么而实现一个接口仅仅表示实现了某个功能即使在他们可以实现对方功能的情形下也应当明确区分其区别(开闭原则),这影响到代码的可维护性和可阅读性。

    另一方面,Java是不支持多继承的,却可以同时实现多个接口,如果我们继承了某个抽象类,就应当表 示子类在本质上属于父类里氏替换原则),而接口的实现仅仅表示可以完成某种功能。也就是说,使用继承描述不会轻易改变的更本质的部分,而使用接口实现更灵活的扩展功能。( 接口隔离原则和合成复用原则)。
 
    需要说明的是,Java 8 增强后的接口可以定义默认方法(使用 default 修饰的方法)和 类方法(使用 static 修饰的方法),接口中的默认方法和类方法都不再是抽象方法,都需要 提供方法体。Java 9 则允许接口中定义 private 方法private 方法可以拥有方法体。

 

 

 

 

 

 

 

 


 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!