Java中类的继承关系,描述的是同一个体系中的事物。比如猫、狗等他们“都是”动物——即“is a”关系,所以猫和狗属于同一个体系——动物体系。那么,我们就把猫、狗他们共同的属性和行为抽取出来,放到一个类中,这个类就是父类——动物类。所谓父类一般都是一个抽象的概念,或者说一个抽象的名词(动物),而子类代表的是具体的事物(猫、狗)。当我们在设计程序的时候,考虑到父类并不描述具体事物,为了避免业务逻辑上的混乱,把父类设计成abstract修饰,即抽象类,可以达到不让别人直接new它的对象的功能,也可以强制要求子类去实现某些功能的效果。这就是为什么要设计成抽象类的原因。
Java中接口的设计理念,从某种角度上讲,是为了扩展功能。比如猴子是一个动物,所以它应该继承自动物类。但猴子很聪明,它能够模仿人类的很多行为,而“模仿”这个功能不是所有的动物都具备的,所以就是猴子的扩展功能。比如猴子模仿人类穿着衣服,它就“像”一个人——即“like a”的关系。我们把“模仿”的功能定义在接口里,猴子类继承动物类的同时,再去实现这个接口就可以了。如果有其它的动物也具有模仿能力,让它也去实现该接口就行了,比如海豚。
综上所述,抽象类更倾向于一个父类,只是在使用时不允许直接new对象等操作,而接口更倾向于功能的扩展:在接口里定义一个功能,谁有需要,谁就来实现即可。其它的区别,就是二者语法上的区别了。 |