今天是22年最后一天了, 写篇博客记录一下吧, 这一年发生了很多事情, 也学到了很多知识, 后面要继续加油啊, 大家也要加油啊, 米娜桑.
目录
概述
区别
1. 定义关键字不同
2. 继承或实现的关键字不同
3. 子类扩展的数量不同
4. 属性访问控制符不同
5. 方法控制符不同
6. 方法实现不同
7. 静态代码块使用不同
概述
接口和抽象类是 Java 面向对象设计的两个基础机制.
接口是对行为的抽象, 它是抽象方法的集合, 利用接口可以达到 API 定义和实现分离的目的. 接口不能实例化; 不能包含任何非常量成员, 任何 field 都是隐含着 public static final
的意义; 同时, 没有非静态方法实现, 也就是说要么是抽象方法, 要么是静态方法. Java 标准类库中, 定义了非常多的接口, 比如 java.util.List.
抽象类是不能实例化的类, 用 abstract 关键字修饰 class, 其目的主要是代码重用. 除了不能实例化, 形式上和一般的 Java 类并没有太大区别, 可以有一个或者多个抽象方法, 也可以没有抽象方法. 抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量, 然后通过继承的方式达到代码复用的目的. Java 标准库中, 比如 collection 框架, 很多通用部分就被抽取成为抽象类, 例如 java.util.AbstractList.
Java 类实现 interface 使用 implements 关键字, 继承 abstract class 则是使 用 extends 关键词,我们可以参考 Java 标准库中的 ArrayList.
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
//...
}
区别
接口和抽象类的区别主要体现在以下 7 个方面.
1. 定义关键字不同
接口使用关键字 interface 来定义.
抽象类使用关键字 abstract 来定义.
2. 继承或实现的关键字不同
接口使用 implements 关键字定义其具体实现.
抽象类使用 extends 关键字实现继承.
3. 子类扩展的数量不同
接口的实现类可以有多个,如下图所示:
而抽象类的子类, 只能继承一个抽象类, 如下图所示, 继承多个抽象类就会报错:
在 Java 语言中, 一个类只能继承一个父类(单继承), 但可以实现多个接口.
4. 属性访问控制符不同
接口中属性的访问控制符只能是 public, 如下图所示:
接口中的属性默认是 public static final 修饰的
抽象类中的属性访问控制符无限制, 可为任意控制符, 如下图所示:
5. 方法控制符不同
接口中方法的默认控制符是 public, 并且不能定义为其他控制符, 如下图所示:
抽象类中的方法控制符无限制, 其中抽象方法不能使用 private 修饰, 如下所示:
6. 方法实现不同
接口中普通方法不能有具体的方法实现,在 JDK 8 之后 static 和 default 方法必须有方法实现,如下所示:
从上述结果可以看出: static 或 default 方法如果没有方法实现就会报错, 而普通方法如果有方法实现就会报错.
抽象类中普通方法可以有方法实现, 抽象方法不能有方法实现, 如下所示:
从上述结果可以看出: 抽象类中的普通方法如果没有方法实现就会报错, 而抽象方法如果有方法实现则会报错.
7. 静态代码块使用不同
接口中不能使用静态代码块, 如下所示:
抽象类中可以使用静态代码块, 如下代码所示: