抽象类和接口的区别
1.抽象类
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。使用abstract class定义抽象类。
抽象类是特点:
①抽象类不能实例化,因为它不是具体的。抽象类的实例化是靠其子类实现的,是实现多态的一种方式。
②抽象类有构造方法,但是不能被实例化,构造方法的作用在于能够让子类访问父类的数据。
③抽象的子类
如果一个类继承一个抽象类而没有重写抽象父类的所有抽象方法,则这个子类是抽象的子类;如果子类重写了父类所有抽象方法,则子类是一个具体类。
④成员特点
- 成员变量:可以是变量,也可以是常量
- 成员方法:可以抽象,也可以非抽象
⑤继承和实现
- 抽象类只能单继承类,既可以继承抽象类也可继承非抽象类
- 抽象类可以实现多个接口
⑥设计理念
被继承体现的是 ”is a”的关系,抽象类中定义的是该继承体系的共性功能。
2.接口
接口就是某个事物对外提供的一些功能的声明,可以利用接口实现多态,同时弥补Java单一继承的缺点。
定义接口的关键字是interface
接口的特点:
①接口不能被实例化,只能通过实现类实例化,通过把接口的引用指向实现类的对象。
②接口没有构造方法。
③实现接口的类要重写接口中定义的所有方法(default方法除外),如果只重写接口中部分方法,则这个类是抽象类。
④成员特点
- 成员变量:只可以常量,默认是以public static final修饰
- 成员方法:只可以是抽象方法,但在JDK1.8之后提供default方法
⑤继承
接口可以继承多个接口,即接口可以实现多继承
⑥设计理念
被实现体现的是 ”like a”的关系,接口中定义的是该继承体系的扩展功能。
JDK1.8中为什么要引入default方法呢?
使用接口,使我们可以面向抽象编程,但是有一个缺点就是当接口有改动时,需要修改所有的实现类。JDK1.8中,为了给已经存在的接口增加新的方法并且不影响已有的实现,引入了default默认方法。默认方法允许在不打破现有的继承体系的基础上改进接口,解决了接口的修改与现有的实现不兼容的现象。
3.抽象类和接口怎么选择?
根据抽象类和接口的不同,当我们仅需要定义一些抽象方法而不需要额外的具体方法或者变量时,我们可以使用接口,否则的话就用抽象类。