最近在学习设计模式的时候,总是对于抽象类和接口特别的混乱,感觉两者特别像,但是又不知道为什么设计模式用抽象类而不用接口,或者用接口而不用抽象类,所以决定总结一下这两者的不同,仅供参考!
什么是抽象类?
抽象类,顾名思义,它表示的是一个抽象体。我们在把一类对象或者行为抽象成类的过程中,常常会发现:我没有办法去具体的描述我抽象出来的这个类。比如动物,动物具体是什么样的?我们不知道,那么我们就把它定义为抽象类,让其他的一些类去继承它,来描述它的具体的一些属性。比如白毛哈巴狗继承动物,那么我们就可以把这个动物描述为一个长着白毛的哈巴狗。
在JAVA中如何定义抽象类?
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。
使用abstract class的方式定义抽象类:
abstract class Test{
abstract void method();
}
使用interface方式定义抽象类:
interface Test{
void method();
}
在abstract class方式中,Test类可以有只单独属于自己的方法,这个类里面只要有一个抽象的方法就是抽象类。但是在interface方式中,Test类只能够有静态的不能被修改的数据成员(static final)所有的都是抽象方法。也就是这个原因,interface可以被认为是特殊的abstract class.
两者的不同之处:
首先,abstract类是用来继承的,一个类只能继承一个抽象类(Java不支持多继承),这样就比较局限。而interface接口,可以由多各类继承,用以实现这个接口中的方法,并且不同接口中的方法可以结合到一个类当中。这就弥补了JAVA不支持多继承的缺点,这两者暂且可以说是互补的吧!
其次,在abstract类当中我们可以赋予这个类自身的常用方法。而interface接口类中却只能有让子类实现的方法,而不能有这个类默认的一些方法。
最后,要想实现继承关系,那么父类和子类就必须要有Is a的关系。也就是说这个父类和子类应该是一个类型的。但是用interface就不用严格的定义这些,接口只是一个行为,我的这个类只要可以拥有这个行为,我就可以去继承这个接口并实现接口中的方法。
总结:
说了这么多,都是关于Java中抽象类和接口中的知识,其实其他语言中的抽象类和接口的不同也和这个类似。只不过可能有的语言支持多继承,那么他们两者的不同中就会少了第一点而已!在网上看到一个特别经典的话,感觉总结抽象类和接口的不同最合适了:抽象类多用于代码的重用,而接口则侧重多态性。