前言
- 在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
方法可以拥有方法体。
来源:oschina
链接:https://my.oschina.net/fairy1674/blog/3187703