一、接口和抽象类的相同点
① 接口和抽象类都不能被实例化,它们用于被其他类实现和继承
② 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法
二、接口和抽象类的区别
① 接口里只能包含抽象方法,静态方法和默认方法,不能为方法提供实现,也就是方法不能书写方法体,而抽象类中的普通方法可以为方法提供实现
② 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是被public static final 修饰的常量,常量必须赋值
③ 接口中不能包含构造器,而抽象类中可以包含构造器,抽象类中的构造器并不是用于创建对象,而是让其子类调用构造器来完成属于抽象类的初始化操作
④ 接口里不能包含初始化代码块,但抽象类里完全可以包含初始化代码块
⑤ 一个类只能继承一个抽象类,而一个类却可以实现多个接口
三、什么时候使用抽象类和接口?
抽象类描述的是事物的本质,而接口描述的是事物的功能
当需要为一些类提供公共的实现代码时,和规范子类行为时,应优先考虑抽象类。因为抽象类中的非抽象方法可以被子类继承下来,使实现功能的代码更简单,并且必须实现抽象方法
当注重代码的扩展性跟可维护性时,应当优先采用接口,一般使用接口的情况更多
如果想实现多重继承,就必须使用接口,由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口,因此你就可以使用接口来实现多重继承
四、接口和抽象类的设计目的
抽象类:强调的是把共同(共有、相同)的属性、方法抽象出来,统一写在一个地方,它们的实现代码是一样的,方便维护(利用的是继承这个特性),也用来规范子类的行为,子类必须重写抽象类中的抽象方法
接口:抽象的行为,同一种行为有不同的实现方式,当多个对象都拥有相同的行为,但是行为的具体实现方式不一样的时候可以用接口抽象(利用的是多态特性)