参考:http://www.cnblogs.com/huihui-gohay/archive/2009/12/13/1623070.html
在实践过程中,抽象类和接口都经常用到。但是,对于什么情况下该用抽象类,什么情况下该用接口,总是有点搞不清楚。
于是,在阅读别人对着两者理解之后,终于对两者的区别有了更进一步的理解。
有关这两者的一些基本区别,可以参考上面的文章。这里我只介绍下对于抽象和接口该在什么情况下使用的理解。
抽象类重点在于对于属性和方法的继承;而接口则重在多个类(可能他们之间毫无联系)对同一种方法或者属性的描述,体现了多态性。
抽象出一个类(类),定义一个抽象方法(判断是否会飞)
1、抽象类
例如:抽象出一个鸟类。对于鸟类,抽象出一个方法。用来判断这种鸟会不会飞。
由于鸟类中的canFly是抽象方法,因此所有继承鸟类的子类都必须实现这个canFly方法。
/** * 鸟 */ public abstract class Bird { public abstract boolean canFly(); } /** * 燕子 * */ public class Swallow extends Bird{ @Override public boolean canFly() { // TODO Auto-generated method stub return false; } } /** * 猫头鹰 * */ public class Owl extends Bird{ @Override public boolean canFly() { // TODO Auto-generated method stub return false; } }
假如现在有这种状况。要同时描述鸟类和飞机,它们可以有一个共同的方法来判断是否能飞。但是这个时候,两者肯定是没有继承关系的啦。
你不能指望飞机通过继承鸟类来获得这个canFly的方法。
此时,你就可以把canFly抽象到接口中,然后鸟类和飞机都继承这个接口。
2、接口
public interface IFly { public abstract boolean canFly(); } /** * 鸟 */ public class Bird implements IFly{ @Override public boolean canFly() { // TODO Auto-generated method stub return false; } } /** * 飞机 * */ public class Airplane implements IFly { @Override public boolean canFly() { // TODO Auto-generated method stub return true; } }