抽象类和接口的异同
一、相同点
抽象类与接口都可以约束类的行为,是一些方法特征的集合,但是没有方法的实现。从这个角度来讲,接口可以看作一种特殊的“抽象类”。
二、不同点
1、抽象类和接口采用完全不同的语法来表示,两者的设计理念也是不同的。
2、一个父类只能有一个直接父类,但可以通过implements实现多个接口。
3、抽象类利于代码复用,接口利于代码的扩展和维护。
4、对于继承抽象类的子类来说,符合is a 的关系,而对于实现接口的子类来说,符合has a 的关系。接口代表一种能力。
5、接口是公开的,里面不能有私有的方法或变量,抽象类可以有私有的方法和私有的变量。
6、实现接口,一定要实现接口里所有的方法,实现抽象类,可以选择性的重写需要用到的方法。
三、接口相对于抽象类的优势
1、接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。
2、一个父类只能有一个直接父类,但可以通过implements实现多个接口。
3、通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。
四、接口的劣势
就是接口所定义的方法和属性只能相对于继承它的类型(除非在继承类中修改接口定义的函数标示),那么对于多层继承关系的时候,光用接口就很难实现。因为如果让每个类型都去继承接口而进行实现的话,首先不说编写代码比较繁琐,有时候执行的结果还是错误,尤其当子类型对象隐式转换成基类对象进行访问的时候。