Java抽象类和接口类

Java中接口和抽象类的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?能解决哪些编程问题?

1)类关键字修饰符:

抽象类使用abstract修饰,含有抽象方法(使用abstract关键字修饰的方法)的类是抽象类,必须使用abstract关键字修饰;
接口使用interface修饰

2)实例化:

抽象类和接口均不能实例化
若想实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象

3)实现:

一个类只能实现一个抽象类;
一个类可以实现多个接口,接口自己本身可以通过extends 关键字扩展多个接口,如果一个类实现多个接口,多个接口有相同default方法,则子类必须重写该方法

4)访问级别关键字修饰符:

JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的
JDK 1.9时,接口中的方法可以是private的
JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default

5)方法:

抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法,抽象类中的抽象方法只有方法体没有具体实现;
接口中的方法均为抽象方法,接口中不能包含实例或静态方法

6)变量

接口中除了 static、final 变量,不能有其他变量,而抽象类中则不一定

7)设计层面:

抽象是对类的抽象,是一种模板设计;接口是对行为的抽象,是一种行为的规范

8)继承层次

抽象类是一种自下而上的设计思路,先有子类的代码重复,然后再抽象成上层的父类(也就是抽象类)。
而接口正好相反,它是一种自上而下的设计思路。我们在编程的时候,一般都是先设计接口,再去考虑具体的实现。

9)使用场景:

使用抽象类是为了代码的复用,
接口是对行为的抽象,而使用接口的动机是为了实现多态性,侧重于抽象和解耦;
接口实现了约定和实现相分离,可以降低代码间的耦合性,提高代码的可扩展性。

10)具体代表:

抽象类-模板模式(把不变的流程抽象到父类的模板方法中,将可变的部分留给子类实现)
eg.
JDK的InputStream、OutputStream、Reader、Writer;
AbstractList中的AddAll是模板方法,add、get、set均抛出异常异常没法正常使用需要子类重写
HttpServlet中的service方法是模板方法,doGet和doPost可以是子类重写定制的部分。

接口:
eg.
Spring的BeanFactory,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系

你可能感兴趣的:(Java抽象类和接口类)