在Java语言中
![](/icons/53144dou.gif)
abstract
![](/icons/53144class.gif)
和
![](/icons/53144int.gif)
erface 是支持抽象类定义
![](/icons/53144de.gif)
两种机制
![](/icons/53144dou2.gif)
正是由于这两种机制
![](/icons/53144de.gif)
存在
![](/icons/53144dou.gif)
才赋予了Java强大
![](/icons/53144de.gif)
面向对象能力
![](/icons/53144dou2.gif)
abstract
![](/icons/53144class.gif)
和
![](/icons/53144int.gif)
erface的间在对于抽象类定义
![](/icons/53144de.gif)
支持方面具有很大
![](/icons/53144de.gif)
相似性
![](/icons/53144dou.gif)
甚至可以相互替换
![](/icons/53144dou.gif)
因此很多开发者在进 行抽象类定义时对于abstract
![](/icons/53144class.gif)
和
![](/icons/53144int.gif)
erface
![](/icons/53144de.gif)
选择显得比较随意
![](/icons/53144dou2.gif)
其实
![](/icons/53144dou.gif)
两者的间还是有很大
![](/icons/53144de.gif)
区别
![](/icons/53144de.gif)
![](/icons/53144dou.gif)
对于它们
![](/icons/53144de.gif)
选择甚至反映出对 于问题领域本质
![](/icons/53144de.gif)
理解、对于设计意图
![](/icons/53144de.gif)
理解是否正确、合理
![](/icons/53144dou2.gif)
本文将对它们的间
![](/icons/53144de.gif)
区别进行
![](/icons/53144yi.gif)
番剖析
![](/icons/53144dou.gif)
试图给开发者提供
![](/icons/53144yi.gif)
个在 2者的间进行选择
![](/icons/53144de.gif)
依据
+U1_2WM:e([,E|b#Bq]0tJAVA中文站社区门户
`Q*S!E5Y6C&@A i8R 理解抽象类
JAVA中文站社区门户5At
Z'h3?oh4O Q|Z^YYY:p[ abstract
![](/icons/53144class.gif)
和
![](/icons/53144int.gif)
erface在Java语言中都是用来进行抽象类(本文 中
![](/icons/53144de.gif)
抽象类并非从abstract
![](/icons/53144class.gif)
翻译而来
![](/icons/53144dou.gif)
它表示
![](/icons/53144de.gif)
是
![](/icons/53144yi.gif)
个抽象体
![](/icons/53144dou.gif)
而abstract
![](/icons/53144class.gif)
为Java语言中用于定义抽象类
![](/icons/53144de.gif)
![](/icons/53144yi.gif)
种思路方法
![](/icons/53144dou.gif)
请读者注意区分)定义
![](/icons/53144de.gif)
![](/icons/53144dou.gif)
那么什么是抽象类
![](/icons/53144dou.gif)
使用抽象类能为我们带来什么好处呢?
Mbl a+f8dL)SJAVA中文站社区门户V2D*xjX 在 面向对象
![](/icons/53144de.gif)
概念中
![](/icons/53144dou.gif)
我们知道所有
![](/icons/53144de.gif)
对象都是通过类来描绘
![](/icons/53144de.gif)
![](/icons/53144dou.gif)
但是反过来却不是这样
![](/icons/53144dou2.gif)
并不是 所有
![](/icons/53144de.gif)
类都是用来描绘对象
![](/icons/53144de.gif)
![](/icons/53144dou.gif)
如果
![](/icons/53144yi.gif)
个类中没有包含足够
![](/icons/53144de.gif)
信息来描绘
![](/icons/53144yi.gif)
个具体
![](/icons/53144de.gif)
对象
![](/icons/53144dou.gif)
这样
![](/icons/53144de.gif)
类就是抽象类
![](/icons/53144dou2.gif)
抽象类往往用来表征我们在对问题领域进行分析、 设计中得出
![](/icons/53144de.gif)
抽象概念
![](/icons/53144dou.gif)
是对
![](/icons/53144yi.gif)
系列看上去区别
![](/icons/53144dou.gif)
但是本质上相同
![](/icons/53144de.gif)
具体概念
![](/icons/53144de.gif)
抽象
![](/icons/53144dou2.gif)
比如:如果我们进行
![](/icons/53144yi.gif)
个图形编辑软件Software
![](/icons/53144de.gif)
开发
![](/icons/53144dou.gif)
就会发现问题领域存在着圆、 3角形这样
![](/icons/53144yi.gif)
些具体概念
![](/icons/53144dou.gif)
它们是区别
![](/icons/53144de.gif)
![](/icons/53144dou.gif)
但是它们又都属于形状这样
![](/icons/53144yi.gif)
个概念
![](/icons/53144dou.gif)
形状这个概念在问题领域是不存在
![](/icons/53144de.gif)
![](/icons/53144dou.gif)
它就是
![](/icons/53144yi.gif)
个抽象概念
![](/icons/53144dou2.gif)
正是
![](/icons/53144yinwei.gif)
抽象
![](/icons/53144de.gif)
概念 在问题领域没有对应
![](/icons/53144de.gif)
具体概念
![](/icons/53144dou.gif)
所以用以表征抽象概念
![](/icons/53144de.gif)
抽象类是不能够例子化
![](/icons/53144de.gif)
JAVA中文站社区门户6Aa*ujKJAVA中文站社区门户
~E7In4|;_]myn1~ 在面向对象领域
![](/icons/53144dou.gif)
抽象类主要用来进行类型隐藏
![](/icons/53144dou2.gif)
我们可以构造出
![](/icons/53144yi.gif)
个固定
![](/icons/53144de.gif)
![](/icons/53144yi.gif)
组行为
![](/icons/53144de.gif)
抽象描 述
![](/icons/53144dou.gif)
但是这组行为却能够有任意个可能
![](/icons/53144de.gif)
具体实现方式
![](/icons/53144dou2.gif)
这个抽象描述就是抽象类
![](/icons/53144dou.gif)
而这
![](/icons/53144yi.gif)
组任意个可能
![](/icons/53144de.gif)
具体实现则表现为所有可能
![](/icons/53144de.gif)
派生类
![](/icons/53144dou2.gif)
模块可以操作
![](/icons/53144yi.gif)
个 抽象体
![](/icons/53144dou2.gif)
由于模块依赖于
![](/icons/53144yi.gif)
个固定
![](/icons/53144de.gif)
抽象体
![](/icons/53144dou.gif)
因此它可以是不允许修改
![](/icons/53144de.gif)
;同时
![](/icons/53144dou.gif)
通过从这个抽象体派生
![](/icons/53144dou.gif)
也可扩展此模块
![](/icons/53144de.gif)
行为功能
![](/icons/53144dou2.gif)
熟悉OCP
![](/icons/53144de.gif)
读者
![](/icons/53144yi.gif)
定知 道
![](/icons/53144dou.gif)
为了能够实现面向对象设计
![](/icons/53144de.gif)
![](/icons/53144yi.gif)
个最核心
![](/icons/53144de.gif)
原则OCP(Open-Closed Principle)
![](/icons/53144dou.gif)
抽象类是其中
![](/icons/53144de.gif)
关键所在
3aY2TkD0L I!Q9J'pv*QJAVA中文站社区门户;dtlDwD 从语法定义层面看abstract
![](/icons/53144class.gif)
和
![](/icons/53144int.gif)
erface
JAVA中文站社区门户*u t/Jk-|/DH}/o;gA5` 在语法层面
![](/icons/53144dou.gif)
Java语言对于abstract
![](/icons/53144class.gif)
和
![](/icons/53144int.gif)
erface给出了区别
![](/icons/53144de.gif)
定义方式
![](/icons/53144dou.gif)
下面以定义
![](/icons/53144yi.gif)
个名为Demo
![](/icons/53144de.gif)
抽象类为例来介绍说明这种区别
JAVA中文站社区门户.E5{\1?dm"cK:I(ED.r 使用abstract
![](/icons/53144class.gif)
![](/icons/53144de.gif)
方式定义Demo抽象类
![](/icons/53144de.gif)
方式如下:
9xA3@pqZ4B-NFT-eJAVA中文站社区门户XVN-eniabstract
![](/icons/53144class.gif)
Demo{
JAVA中文站社区门户^9x
F1i`Xj/s.xabstract void method1
![](/icons/53144kh.gif)
;
JAVA中文站社区门户%KM3k,F h+Ib6eabstract void method2
![](/icons/53144kh.gif)
;
%NePB(j/mnx…
4mO,~K;J dB1p`}
JAVA中文站社区门户jq_fG0lk\JAVA中文站社区门户;k"WA,R doTa 使用
![](/icons/53144int.gif)
erface
![](/icons/53144de.gif)
方式定义Demo抽象类
![](/icons/53144de.gif)
方式如下:
JAVA中文站社区门户jT H[ me,s#x:S/?
uj&yq/tWv^![](/icons/53144int.gif)
erface Demo{
JAVA中文站社区门户g6T;G ODs_void method1
![](/icons/53144kh.gif)
;
'N5w8_F1ot#evoid method2
![](/icons/53144kh.gif)
;
JAVA中文站社区门户5jVUv#})_…
4D(uUOF/}6C}
JAVA中文站社区门户d4`|m4I2l$F@1@9B,b8ki6KJC 在abstract
![](/icons/53144class.gif)
方式中
![](/icons/53144dou.gif)
Demo可以有自己
![](/icons/53144de.gif)
数据成员
![](/icons/53144dou.gif)
也可以有非 abstract
![](/icons/53144de.gif)
成员思路方法
![](/icons/53144dou.gif)
而在
![](/icons/53144int.gif)
erface方式
![](/icons/53144de.gif)
实现中
![](/icons/53144dou.gif)
Demo只能够有静态
![](/icons/53144de.gif)
不能被修改
![](/icons/53144de.gif)
数据成员(也就是必须是
![](/icons/53144static.gif)
final
![](/icons/53144de.gif)
![](/icons/53144dou.gif)
不过在
![](/icons/53144int.gif)
erface中
![](/icons/53144yi.gif)
般不定义数据成员)
![](/icons/53144dou.gif)
所有
![](/icons/53144de.gif)
成员思路方法都是abstract
![](/icons/53144de.gif)
![](/icons/53144dou2.gif)
从某种意义上说
![](/icons/53144dou.gif)
![](/icons/53144int.gif)
erface是
![](/icons/53144yi.gif)
种特殊形式
![](/icons/53144de.gif)
abstract
![](/icons/53144class.gif)
![](/icons/53144dou2.gif)