这道题想考察什么?
1.是否熟悉抽象类和接口的定义,区别?
2.是否熟悉 Java 8 之后的接口变化?
考察的知识点
1.抽象类和接口的定义,区别
2.Java 8 之后的接口变化
考生应该如何回答
1、考生首先应该回答抽象类和接口的定义和区别,接口和抽象类是 Java 面向对象设计的两个基础机制。
接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。
Java 标准类库中,定义了非常多的接口,比如 java.util.List。
抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。
抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。Java 标准库中,比如 collection 框架,很多通用部分就被抽取成为抽象类,例如 java.util.AbstractSequentialList。
Java类实现接口 interface 使用 implement 关键字,继承抽象类 abstract class 则是使用 extends 关键字。我们可以参考Java 中的 LinkedList 的实现方式:
public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable{
下面来说一下两者的区别(暂不包含 Java 8 及其以上版本):
支持多重继承:接口支持;抽象类不支持;
支持抽象函数:接口语义上支持;抽象类支持;
允许函数实现:接口不允许;抽象类支持;
允许实例化:接口不允许;抽象类不允许;
允许部分函数实现:接口不允许;抽象类允许;
定义的内容:接口中只能包括 public 函数以及 public static final 常量;抽象类无任何限制。
使用时机:当想要支持多重继承,或是为了定义一种类型请使用接口;当打算提供带有部分实现的“模板”类,而将一些功能需要延迟实现请使用抽象类;
2、从 Java 8 开始,interface 增加了对 default method 的支持。Java 9 以后,甚至可以定义 private default method。Default method 提供了一种二进制兼容的扩展已有接口的办法。比如,我们熟知的 java.util.Collection,它是 collection 体系的 root interface,在 Java 8 中添加了一系列 default method,主要是增加 Lambda、Stream 相关的功能。前面提到的类似 Collections 之类的工具类,很多方法都适合作为 default method 实现在基础接口里面。
public interface Collection<E> extends Iterable<E> { /** * Returns a sequential Stream with this collection as its source * ... **/ default Streamstream() { return StreamSupport.stream(spliterator(), false); }}
总结
考生回答该问题时应该对抽象类和接口的定义有清晰的认知,知道两者之间的区别和使用场景,同时也要注意Java 8 之后接口是允许有方法实现的。
分享、在看与点赞都在这儿点下给小编加点料