文档章节

Java抽象类与接口的异同及使用场合

javaART
 javaART
发布于 2017/09/04 12:37
字数 954
阅读 9
收藏 0

什么是抽象类?

抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。抽象类不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。

什么是接口?

接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。

例子:飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。

 

相同点: (1)都不能被直接实例化,都可以通过继承实现其抽象方法。

              (2)都是面向抽象编程的技术基础,实现了诸多的设计模式。

不同点:(1) 接口支持多继承;抽象类不能实现多继承。 接口只能定义抽象规则;

              (2)抽象类既可以定义规则,还可能提供已实现的成员。 接口是一组行为规范;

              (3)抽象类是一个不完全的类,着重族的概念。 接口可以用于支持回调;

              (4)抽象类不能实现回调,因为继承不支持。 接口只包含方法、属性、索引器、事件的签名,

                      但 不能定义字段和包含实现的方法;

               (5)抽象类可以定义字段、属性、包含有实现的方法。 接口可以作用于值类型和引用类型;

               (6)抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

               (7)抽象类有构造方法,接口却没有构造方法。

接口的应用场合:

  1. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。
  2. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
  3. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
  4. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

抽象类的应用场合:

一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:

  1. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
  2. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
  3. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能

© 著作权归作者所有

共有 人打赏支持
javaART
粉丝 0
博文 35
码字总数 12399
作品 0
昆明
后端工程师
115个Java面试题及回答

解释下可用的线程状态. 在执行期间, 线程会处于以下状态中的一种: Runnable: 线程已准备就绪, 但没有立即运行. Running: 处理器正在执行的线程代码. Waiting: 处于阻塞状态的线程, 等待外部某...

Yamazaki
2014/04/25
0
0
回调函数,就是回头再调用的函数

又遇到了回调函数,这次打算写下来分享一下。 所谓回调函数,或者在面向对象语言里叫回调方法,简单点讲,就是回头在某个时间(事件发生)被调用的函数。 再详细点:就是一个函数A,作为参数,传...

er3456qi
08/27
0
0
JAVA接口的概念、分类及与抽象类的区别

Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(...

郭二翔
2011/12/17
0
0
JAVA程序员面试题整理(较全面)

以下是在面试中可能会遇到的问题,话不多说,往下看 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? ...

编程大侠
04/09
0
0
JAVA面试题总结(SE部分)

Person p = new Person(); 创建一个对象都在内存中做了什么事情? 1:先将硬盘上指定位置的Person.class文件加载进内存。 2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然...

期待变强的菜鸟
2014/03/16
0
1

没有更多内容

加载失败,请刷新页面

加载更多

postgresql 使用odbc_fdw连接 sqlserver

安装配置odbc_fdw 1.安装unixODBC apt-get install unixodbc unixodbc-dev 2.安装 Microsoft ODBC Driver 17 for SQL Server curl https://packages.microsoft.com/config/ubuntu/16.04/prod......

dubox
29分钟前
1
0
学习

z-index {堆叠顺序} vertical-align: baseline;{垂直对齐图像} vertical-align: middle;{内容在中部对齐} font-weight: bold;{使用粗体} font-style: italic;{从父元素那继承字体的样式} whi...

墨冥
34分钟前
1
0
Lock和synchronized比较详解

https://www.cnblogs.com/handsomeye/p/5999362.html

qimh
41分钟前
1
0
Postman接口测试神器从安装到精通

1 摘要 Postman 是一个接口测试和 http 请求的神器,非常好用。 官方 github 地址: https://github.com/postmanlabs Postman 的优点: 支持各种的请求类型: get、post、put、patch、delete ...

HiBlock
42分钟前
1
0
c++_拷贝构造函数

拷贝构造又叫复制构造;如果没有实现拷贝构造函数,c++会自动生成一个,叫做隐式拷贝构造函数.该自动生成的隐式拷贝构造也能应付绝大部分情况. 拷贝构造函数的格式: //定义class CTest{p...

一个小妞
42分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部