美文网首页程序员Java 杂谈IT面试
023:接口和抽象类有什么区别?

023:接口和抽象类有什么区别?

作者: 程序熊大 | 来源:发表于2019-05-19 00:19 被阅读21次
为你的面试加油

参考答案

在Java中可以用接口和抽象类来定义允许有多个实现的类型;不过,接口和抽象类有两个主要的不同:

  • 抽象类允许包含某些方法的实现,接口则不允许;【Java8中已经提供了默认方法】
  • 从设计层面看,为了实现由抽象类定义的类型,类必须定义为抽象类的子类,这就限制了它在类图中的层次,但是接口则没有这种层次的限制;

在实际开发中,我们应该遵循一个原则——接口优于抽象类,主要是由于接口有三个方面的优势:

  • 只要实现新的接口,就可以给现有的类增加新的功能;但是一个类只能继承自一个父类;
  • 接口非常适合用于定义mixin(混合类型)。Comparable是一个mixin接口,是因为任何类型的对象都可以实现该接口来提供对象比较的能力,跟自己的主要功能混合。
  • 接口对实现它的类没有严格的层次要求,在设计上更灵活。

知识点梳理

Java中的抽象类

抽象类的设计理念介于普通的类与接口之间,抽象类的目标是为了设计一个通用的、允许有多个实现的类型。

包含抽象方法的类叫做抽象类;抽象类无法实例化,如果一个类继承了某个抽象类,并且想实例化,就需要实现抽象类中的所有抽象方法。

抽象类在Java中的应用,最经典的是“骨架模式”——和接口配合使用,让设计同时具备抽象类和接口的优点——抽象类的演变比接口的演变要容易,同时允许系统中的其他类不使用这个骨架实现类。

在“骨架模式”中,接口的作用仍然是定义类型,骨架实现类就是一个抽象类,负责所有与接口实现相关的工作。Collections Framework中大量应用了“骨架模式”,例如:AbstractCollection、AbstractList、AbstractMap和AbstractSet,将一些通用的操作都放在骨架实现类中实现,这样具体的ArrayList和LinkedList就可以专注于自己的特性的实现,避免写重复代码。


Java集合框架

“骨架模式”听起来有点像设计模式中的模板方法,不过二者之间还是有不一样的:“骨架模式”的目标是从代码层面避免重复代码,“模板方法”的目标是在设计层面对某一类事情的抽象和扩展点的设计。

Java中的接口

在Java中接口的语义是“is like”——任何实现了某个接口的类,看起来就像具备了这个接口的能力。

在Java中,接口可以用来做三个事情:(1)类型定义;(2)保存一些常量;(3)作为标签使用。不过在《Effective Java》的第19条指出,接口应该只用于定义类型。

在Java8之前,接口中只能出现方法的声明,不能出现方法的实现;Java 8对接口的能力做了增强:(1)接口中可以有default methodstatic method;(2)提供了一种新的接口——FunctionInterface

default method

Java 8中引入default method最主要的动机是:在Java 8中要支持lambda表达式,这就需要对原来JDK中的很多接口做修改,但是由于接口的特性(其实现类必须实现接口中声明的所有方法)的限制,如果直接修改,就会导致现有的Java应用在升级到Java 8的时候全部编译报错——这是不可接受的。

default method出现有,对于使用Java 8的开发者来说有几个好处:

  • 可以按照需要扩展接口,而不需要担心影响已有的实现类;
  • 使得接口和抽象类几乎没有区别了,后面可以放心得使用接口,同时能利用default method获得抽象类的优点;
  • 可以省去很多为某个接口提供的工具类了,这些工具类中的方法可以放在接口中实现,例如Collections这个类中的方法可以都放在Collection接口中;

static method

static method有点像default method,但是你在使用过程中不能覆盖static method,因此,如果有些方法你不希望被具体的实现类破坏,就可以将之声明为static method。

在实际开发中,对于static method的使用你可以注意几个点:

  • static method是属于某个接口的,不是属于某个对象的;
  • static method比较适合用于实现接口相关的工具方法,例如空值检查、集合排序等等;
  • 将Collections中的方法移动到Collection接口中,方便开发者找到对应的方法使用,这种方法也比较适合使用static method。

函数式接口

为了支持lambda表达式,Java 8引入了一个新的注解——@FunctionalInterface,如果某个接口被这个注解修饰,这个接口就会被称为函数式接口。函数式接口注解不是必须的,但是是一种好的实践。

如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。。

参考资料

  1. https://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method
  2. 《Effective Java(中文版)第二版》
  3. 《Java编程思想》

本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。


javaadu

相关文章

  • 接口和抽象类的区别

    接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样。接口是对动作的抽象,抽象类...

  • 023:接口和抽象类有什么区别?

    参考答案 在Java中可以用接口和抽象类来定义允许有多个实现的类型;不过,接口和抽象类有两个主要的不同: 抽象类允...

  • 2018-07-19 java基础(一)

    1.abstract class 和interface 有什么区别? 抽象类可以有构造方法 接口不行 抽象类可以有...

  • Kotlin 零基础学习 接口和抽象类

    接口:接口就是暴露一种物体与另外一种物体沟通的方法 抽象类 接口 这么看接口和抽象类没什么区别,抽象类能干的接口也...

  • 7.Java抽象类和接口,基本类有什么区别

    问题:Java抽象类和接口,基本类有什么区别? 抽象 概念:使用了关键字 abstract 声明的类叫做抽象类。如...

  • 接口和抽象类有什么区别?

    程序员面试最容易被问到的题,你有没有被击中过 接口和抽象类有什么区别? ①抽象类和接口都不能直接实例化,如果要实例...

  • 2018面试宝典

    1.抽象类(abstract class)和接口(interface)有什么区别? 答:相同点:都不能被实例...

  • 2018-06-17 Java抽象类与接口的区别

    很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们...

  • Java面向对象

    Java和iOS的面向对象大体上没有什么区别,有几点需要注意: 抽象类 接口类 多继承 重载 对象 接口 包

  • 接口与抽象类的区别

    抽象类与接口有什么区别: 相同点: 都不能实例化对象 不同: 1.使用interface 抽象类用abstract...

网友评论

    本文标题:023:接口和抽象类有什么区别?

    本文链接:https://www.haomeiwen.com/subject/qhjxzqtx.html