抽象类:abstract class
接口:interface
在java的类中,只要有一个方法为抽象方法,那么该类就是抽象类。换句话说,抽象类可以提供部分方法的具体实现,这一点在接口中是不被允许的。
接口中,只能够有方法的定义,而不能有方法体。
关于抽象类和接口,很容易看出来它们并不能对对象进行实例化操作,那么它们的唯一存在意义就是拿来继承用的。假如说一个继承了抽象类的类,如果没有将父类的抽象方法全部实现,那么它仍然是一个抽象类。
抽象类中的抽象方法必须是public或者protect的(默认为public),这很容易想明白,如果抽象方法是private的话,那么子类就不能重写该方法,因而就没有意义了。其实,抽象类中可以定义具体的方法还是一个
很不错的优点的,举个栗子,当你想为某个模块添加一个新功能时,你只需要在抽象类中添加一个方法具体实现,那么继承这个抽象类的所有实现类都轻而易举的拥有了这个方法。
说完抽象类,感觉跟接口差不多啊,可以这样理解,接口要比抽象类更加抽象,并且定义更加严格。
接口中的属性和方法分别被隐式的修饰为public static final和public abstract,当然一般情况下是不建议在接口中放置属性的。假如说要在接口中添加一个新的抽象方法,那么实现这个接口的所有类都必须实现
该抽象方法,这一点要比抽象类要麻烦得多。
说了这么多,再来比较一下接口和抽象类的区别吧。
java是单继承机制的语言(C++是多继承的),因此当一个实现类继承一个抽象类是,它的类型就比较单一。而接口则不同,如果一个类实现了一个接口的所有抽象方法,那么该类就拥有此接口
的类型,而且一个类可以实现多个接口,因此这个类就有了更多的类型。
还有一个区别,那就是在抽象类中可以有静态方法和静态变量,而接口是不允许的。
那么到底应该在什么时候用他们呢,个人是这样理解的,抽象类和子类的关系更偏向于”是或者不是的关系“,更倾向于一些固有属性,比如说人肯定是有”两只手两只脚“之类的属性。而接口和子类的关系则偏向于”有
或者没有的关系“,比如说这个人带了一顶帽子,那个人却没带。
在网上找到了一个很有趣的例子
interface Window{ public void draw(); public void putColor(); public void setPosition(); } abstract class DesignedPage implements Window{ public void draw(){} public void putColor(){} } public class DesingedPageA extends DesignedPage{ public void setPosition(){ //set the window position } }
这里接口有三个方法,但是作为该模块内部的一个对象,我只想用他的setposition()方法,其他的我并不想看到,那就可以这样来做:
1.创建一个抽象类Designedpage,然后我们把不想看到的方法draw()和putcolor()加上去,方法体设置为空(实际上这样写表明已经
在抽象类中实现了这两个方法)。
2.然后忽略掉想要实现的方法setposition(),此时应为该类是抽象类并不用完全实现该接口。
3.在该抽象类的实现类中再实现setposition()方法,这样便可方便的实现了所需的功能。
从这里也可以看出,抽象类是”对内“的,而接口是”对外“的,用于创造一个统一的对外口径。
之所以能这样写,是因为抽象类是不能被实例化的,所以没有要求实现所有的方法。但是没写出的方法还是隐式的存在的。
当你在定义一个实现类继承抽象类的话,就必须要全部实现。
参考资料:http://fishswing.iteye.com/blog/1527166