作为一个基础的Java高频面试题,是所有Java面试者必须烂熟于心的。当然不能死记硬背,可以通过实际地写几个小demo,边实际操作边理解,既能感受到编程的快乐,更重要的是真的理解记住了二者的区别。
此外,本篇文章是在Java1.8的基础上进行讲解的,网上一些文章,没有说明Java版本,上来直接讲一大堆知识,有的文章通篇讲的是Java1.7或者更早的版本,容易误导初学者,让初学者以为Java1.7的区别就是Java1.8的区别,其实,对于接口和抽象类的区别这个问题,1.8和1.7还是不一样的。并且现在无论实际开发还是面试,都是基于Java1.8的。(在文章中也会穿插说下Java1.7相关内容)
1、一个类只能继承一个抽象类,但可以实现多个接口
Java规定,一个类只能有一个父类。但是,对于这个父类而言,它可以有多个子类,也就是说,可以同时有多个类继承同一个父类。一个类可以同时实现多个接口。
特别注意的是,接口自己本身可以通过extends关键字扩展多个接口。(类只能单继承,但是接口可以多继承) 如图:
2、接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符。
抽象方法就是为了被重写所以不能使用 private 关键字修饰。
接口方法默认修饰符是 public,jdk8中接口可以有默认方法(default修饰)和静态方法(static修饰)。
"接口方法默认修饰符是public"这句话,你可以在Intellij IDEA编辑器试一下,当你在方法前加上public时,编辑器会有提示"对于接口方法而言,public是多余的"
3、接口没有构造方法,抽象类有构造方法
接口中没有构造方法,因为接口是个集合,并不是类。(官方定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。)虽然接口内的方法都是抽象的(和抽象方法很像,没有实现,Java1.8中默认方法和静态方法可以有实现)但是不需要abstract关键字。
抽象类有构造方法,抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
(!!! PS:有人会问,既然抽象类不能实例化对象,那么抽象类的构造方法没有用处了? 非也!
在抽象类中可以有构造方法,只是不能直接创建抽象类的实例对象,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类,先初始化父类。如下图:
!!! )
4、实现方法的区别
抽象类里面的抽象方法必须全部被子类实现,如果子类不能全部实现,那么子类必须也是抽象类。接口里面的方法也必须全部被子类实现,如果子类不能实现那么子类必须是抽象类。
当然,抽象类和接口的区别还有很多,就不再这里一一列举了,樱木会尽心尽力写好每一篇文章,如果喜欢的话,请关注微信公众号:樱木乐趣编程