接口和抽象类
之前在面试的时候,有遇到问接口和抽象类的区别。虽然自己用了很多的借口和抽象类,但是对于两种的理解还是不够高,所以自己再总结总结。
1.抽象类
抽象类定义:
[public] abstract class ClassName {
abstract void fun();
}
抽象类需要abstract关键字,类成员可以有成员变量,有具体方法,静态方法,静态常量,有抽象方法(需要关键字abstract)
不能创建对象,而且抽象方法不能是private,因为私有的就不能继承了,抽象类就是用来继承,不让要他有何用,默认不写是public
2.接口
接口定义:
[public] interface InterfaceName{
}
接口狭义来说就是一个对外提供的方法,广义来说就是系统之间对接的端口
接口里可以有方法(抽象方法),变量(只能是public,而且会被隐式地指定为public static final变量),一般接口中不会定义变量的
3.区别:
a.一个类可以实现多接口,但只能继承一个抽象类
b.类实现接口,必须实现接口里所有方法;类继承抽象类,也是必须实现抽象类中所有抽象方法,但是抽象类实现接口时,不需要实现所有方法
c.抽象类可以提供正常方法,对于这一点,抽象类的扩展要比接口好。比如,在抽象类中定一个正常方法,他的子类不需要改动代码就有了这个方法,而在接口中定义一个方法,而实现它的类都得去实现这个方法,所以在一定程度上抽象类要比接口好
d.在设计上,接口是对行为的抽象,比如飞,跑等等;而抽象类是对物的抽象,即类的抽象,比如动物,鸟类这些;结合a和c就可以把接口和抽象类的有点结合起来,这就是缺省适配模式:定义一个InterfaceA接口;定义一个AbstractA接口实现InterfaceA;而A类实现InterfaceA接口和继承AbstractA类,具体想了解可以google缺省适配模式;也可以java中的API,我影响比较深的集合的设计就用到这种设计模式
4.参考:
https://www.cnblogs.com/dolphin0520/p/3811437.html
https://blog.csdn.net/xw13106209/article/details/6923556
https://blog.csdn.net/xw13106209/article/details/6926253