关于什么时候用抽象类,什么时候用接口,我在这里做一下总结。
首先看下面的例子:
Java代码
1. abstract class
AbstractStudent{
abstract void study();
void sleep(){
System.out.println("sleep");
}
void smoke(){
System.out.println("抽烟");
}
}
//所有的Student被创建都会抽烟,是不是很搞笑?
class Student extends AbstractStudent{
Student Demo stu = new Student();
...
}
上 面这个学生抽象类中有三个方法,学习,睡觉,抽烟。我们知道任何一个学生都要学习,都要睡觉,但是不是每个学生都要抽烟呢?这显然是不合理的。难道说创建 一个学生对象,就一定要强加给他抽烟的方法?就像一个学生来了,就一定要他会抽烟?女生也不放过?哈哈!这显然是很荒唐的事情。于是我们做如下调整:
Java代码
abstract class AbstractStudent{
abstract void study();
void sleep(){
System.out.println("sleep");
}
}
interface Smoking{
void smoke();
}
//普通的学生,继承AbstractStudent,有学习、睡觉的方法,不抽烟
class Student extends
AbstractStudent{
}
//抽烟的学生,除了继承AbstractStudent中的方法,还会抽烟
class SmokeStudent extends AbstractStudent implements Smokeing{
}
Java代码
1. 这样,就把抽烟的同学和不抽烟的同学分离开了。
现在你感觉到了抽象类与接口的不同点了吗?
总结:抽象类中通常放的是类种事物(对象)共有的属性和方法,于是它的子类继承它的时候
就自然有了其所有属性和方法,当有些方法是某种子类特有的时,就应该将这个方法分离出来,
以附加的形式(implements)添加进去。
这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。