在java中定义类时
![](/icons/38667dou.gif)
可以仅声明思路方法名称而不操作其中
![](/icons/38667de.gif)
逻辑
![](/icons/38667dou.gif)
这样
![](/icons/38667de.gif)
思路方法称的为抽象思路方法
![](/icons/38667dou2.gif)
如果
![](/icons/38667yi.gif)
个思路方法中包括了抽象思路方法
![](/icons/38667dou.gif)
则该类称的为抽象类
![](/icons/38667dou2.gif)
抽象类是拥有未实现思路方法
![](/icons/38667de.gif)
类
![](/icons/38667dou.gif)
所以它不能被用来生成对象
![](/icons/38667dou.gif)
它只能被继承扩展
![](/icons/38667dou.gif)
并于继承后实现未完成
![](/icons/38667de.gif)
抽象思路方法
![](/icons/38667dou2.gif)
在java中声明抽象思路方法和抽象类
![](/icons/38667dou2.gif)
要用abstract关键词
![](/icons/38667dou2.gif)
以下举个实际
![](/icons/38667de.gif)
例子
![](/icons/38667dou.gif)
先假设设计了两个类——ConcreteCircle和HollowCricle
2Rc4`&^)Gs O%O-a7\ public
![](/icons/38667class.gif)
ConcreteCricle{
|w _}YV$le I private double radius;
1c
uDF8GL? public void
![](/icons/38667set.gif)
Redius(
![](/icons/38667int.gif)
radius){this.radius=radius;}
9nWi*y$E*P,k public double getRadius
![](/icons/38667kh.gif)
{
![](/icons/38667return.gif)
radius;}
+D/G4|W'@$V,]g public void render
![](/icons/38667kh.gif)
{
$\6Iqg.q)I
\
J ![](/icons/38667System.gif)
.out.pr
![](/icons/38667int.gif)
f("画
![](/icons/38667yi.gif)
个半径%f
![](/icons/38667de.gif)
实心圆\n",getRadius
![](/icons/38667kh.gif)
);
JAVA中文站社区门户1\9FS6Kb
a/EE[ }
JAVA中文站社区门户'Ut9eSg:ou3Jh }
;n0a*a8R o]L#U public
![](/icons/38667class.gif)
HollowCricle{
JAVA中文站社区门户tS#C"y0sas)y5We4K.n private double radius;
nfR_5VK public void
![](/icons/38667set.gif)
Redius(
![](/icons/38667int.gif)
radius){this.radius=radius;}
JAVA中文站社区门户
TGE @!Y5{a t public double getRadius
![](/icons/38667kh.gif)
{
![](/icons/38667return.gif)
radius;}
a2ece]F{5C.Y"G'@ public void render
![](/icons/38667kh.gif)
{
~'E~^.Dio ![](/icons/38667System.gif)
.out.pr
![](/icons/38667int.gif)
f("画
![](/icons/38667yi.gif)
个半径%f
![](/icons/38667de.gif)
空心圆\n",getRadius
![](/icons/38667kh.gif)
);
A+@p$]!iL2c }
]b s![P.|u5@ }
]:\7p!x0L#h"bo!N显然
![](/icons/38667de.gif)
![](/icons/38667dou.gif)
这两个类除了render
![](/icons/38667kh.gif)
思路方法
![](/icons/38667de.gif)
实现内容区别的外
![](/icons/38667dou.gif)
其他
![](/icons/38667de.gif)
定义是
![](/icons/38667yi.gif)
样
![](/icons/38667de.gif)
![](/icons/38667dou.gif)
而且这两个类所定义
![](/icons/38667de.gif)
都是圆
![](/icons/38667de.gif)
![](/icons/38667yi.gif)
种类型
![](/icons/38667dou2.gif)
可以定义
![](/icons/38667yi.gif)
个抽象
![](/icons/38667de.gif)
AbstactCircle类
![](/icons/38667dou.gif)
将ConcerteCircle和HollowCircle中相同
![](/icons/38667de.gif)
行为和定义提取(Pull up)至抽象类中
![](/icons/38667dou.gif)
如下例所示:
JAVA中文站社区门户5|S\)Y6X!K5{public abstract
![](/icons/38667class.gif)
AbstactCircle{
JAVA中文站社区门户
lCE/p)F4Y
I protected double radius;
JAVA中文站社区门户XB` o9wg9} public void
![](/icons/38667set.gif)
Redius(
![](/icons/38667int.gif)
radius){this.radius=radius;}
Rs r
f:I4]Ih.\ public double getRadius
![](/icons/38667kh.gif)
{
![](/icons/38667return.gif)
radius;}
JAVA中文站社区门户8I:uL)i2[s public abstract void render
![](/icons/38667kh.gif)
;
Y+In#frg}
@]H"h @注意到在类声明上使用了abstract关键词
![](/icons/38667dou.gif)
所以AbstactCircle是个抽象类
![](/icons/38667dou.gif)
它只能被继承
![](/icons/38667dou.gif)
而render
![](/icons/38667kh.gif)
思路方法上也使用了abstract关键词
![](/icons/38667dou.gif)
表示它是个抽象思路方法
![](/icons/38667dou2.gif)
目前还不用实现这个思路方法
![](/icons/38667dou.gif)
继承了AbstactCircle
![](/icons/38667de.gif)
类必须实现render
![](/icons/38667kh.gif)
思路方法
![](/icons/38667dou.gif)
接着可以让ConcreteCircle类继承AbstactCircle思路方法并是想render
![](/icons/38667kh.gif)
思路方法
![](/icons/38667dou.gif)
如范例所示:
JAVA中文站社区门户PX2eJ4FJConcreteCircle.java
JAVA中文站社区门户"r `s9P,dbpublic
![](/icons/38667class.gif)
ConcreteCricle extends AbstactCircle{
TK D!wq*e.P,CY public ConcreteCricle
![](/icons/38667kh.gif)
{}
JAVA中文站社区门户x"H&s2b
l7Ue^ public ConcreteCricle(double radius){this.radius=radius;}
JAVA中文站社区门户"vZA3@DJ3S public void render
![](/icons/38667kh.gif)
{
JAVA中文站社区门户}?
] D"P uX ![](/icons/38667System.gif)
.out.pr
![](/icons/38667int.gif)
f("画
![](/icons/38667yi.gif)
个半径%f
![](/icons/38667de.gif)
实心圆\n",getRadius
![](/icons/38667kh.gif)
);
]^c"z3c U }
JAVA中文站社区门户0Hxc4b,j }-R6_P`0k}
#g*u\(^1d*k:a8B6btHollowCircle.java
JAVA中文站社区门户@
}n3M&s4r9Yupublic
![](/icons/38667class.gif)
HollowCircle extends AbstactCircle{
JAVA中文站社区门户m7o d
aN
L public HollowCircle
![](/icons/38667kh.gif)
{}
JAVA中文站社区门户-? cycks public HollowCircle(double radius){this.radius=radius;}
(Q8? Nl1E%@\ public void render
![](/icons/38667kh.gif)
{
JAVA中文站社区门户6v#R v$]@+Y&}(i;s ![](/icons/38667System.gif)
.out.pr
![](/icons/38667int.gif)
f("画
![](/icons/38667yi.gif)
个半径%f
![](/icons/38667de.gif)
空心圆\n",getRadius
![](/icons/38667kh.gif)
);
}#V HY9A$IB"N }
1c[u[8R!S9C)K3o8pV}
8a1{Tb9qg1q由于共同
![](/icons/38667de.gif)
定义被提取至AbstactCircle类中
![](/icons/38667dou.gif)
并于扩展时继承了下来
![](/icons/38667dou.gif)
所以在ConcreteCricle和HollowCircle中不用重复定义
![](/icons/38667dou.gif)
只要定义个别对render
![](/icons/38667kh.gif)
![](/icons/38667de.gif)
处理方式就行了
![](/icons/38667dou2.gif)
由ConcreteCricle和HollowCircle都是AbstactCircle
![](/icons/38667de.gif)
子类
![](/icons/38667dou.gif)
因而可以使用AbstactCircle上有定义
![](/icons/38667de.gif)
实现接口
![](/icons/38667dou.gif)
来实现子类例子上
![](/icons/38667de.gif)
思路方法
![](/icons/38667dou.gif)
如范例所示:
.L({5Dp/V:Ex1_.M/ppublic
![](/icons/38667class.gif)
CircleDemo{
*\~nG`8IsGGO public
![](/icons/38667static.gif)
void
![](/icons/38667main.gif)
(String
![](/icons/38667zhk2.gif)
args){
JAVA中文站社区门户
v@-H4Gl([ renderCircle(
![](/icons/38667new.gif)
ConcreteCircle(3.33));
L1pmU8{p^ renderCircle(
![](/icons/38667new.gif)
HollowCircle(10.2));
;?ej0~ W f%z.?I }
$GR(A3}&^ public
![](/icons/38667static.gif)
void renderCircle(AbstractCircle circle){
+J"mBAdbLA3c circle.render
![](/icons/38667kh.gif)
;
JAVA中文站社区门户?$D9a2v;~ }
fS+Yx5SxzJ,H}
JAVA中文站社区门户7[o sWd;?j4|)GdG由于AbstractCircle上定义有render
![](/icons/38667kh.gif)
思路方法
![](/icons/38667dou.gif)
所以可用于实现子类例子
![](/icons/38667de.gif)
思路方法
![](/icons/38667dou.gif)
这是继承上多台实现
![](/icons/38667de.gif)
哟个例子用用
![](/icons/38667dou2.gif)
执行结果如下:
*C;n*@0?z(}~:AAt画
![](/icons/38667yi.gif)
个半径 3.330000
![](/icons/38667de.gif)
实心圆
JAVA中文站社区门户Bqh2]wq#h|画
![](/icons/38667yi.gif)
个半径10.200000
![](/icons/38667de.gif)
空心圆