本文基于jdk1.8谈论接口和抽象类的区别
1.抽象类
1.1抽象类的定义
抽象类通常包含抽象方法、非抽象方法和属性。子类要么实现这些抽象方法,要么也声明为抽象类。非抽象方法和属性可以有具体的实现代码,并且可以被子类继承,根据需要进行覆盖和修改。由于抽象方法的存在,抽象类是一个不能被实例化的类,只能被用作其他类的父类。
public abstract class AbstractExample {
// 定义普通变量
int count = 2;
// 定义私有变量
private static int total = 10;
// 定义抽象方法
public abstract void methodA();
// 定义普通方法
public void methodB() {
System.out.println("Hi,methodB.");
}
}
2.接口
1.2接口的定义
接口是 Java 语言中的一个抽象类型,用于定义对象的公共行为。它的创建关键字是 interface,在 JDK 8 之后,接口中可以创建 static 和 default 方法了,并且这两种方法可以有默认的方法实现。
public interface Interface_1 {
int count = 1;
void sayHi();
// default 方法
default void print() {
System.out.println("Do print method.");
}
// static 方法
static void smethod() {
System.out.println("Do static method.");
}
}
3.区别
- 定义方式:
- 抽象类:使用
abstract关键字定义。 - 接口:使用
interface关键字定义。
- 抽象类:使用
- 实现:
- 抽象类:可以部分实现(即包含抽象方法和非抽象方法)。
- 接口:在Java 8之前只能定义抽象方法,从Java 8开始可以包含默认方法(有默认实现的方法)和静态方法。
- 成员变量:
- 抽象类:成员变量可以是各种类型,包括实例变量和类变量。
- 接口:在Java 8之前只能定义公共的静态的最终变量(public static final),从Java 8开始可以定义实例变量(默认是
public static final)。
- 构造函数:
- 抽象类:可以有构造函数。
- 接口:不能有构造函数。
- 访问修饰符:
- 抽象类:除抽象方法不能用private修饰外,可以有各种访问修饰符。
- 接口:除了静态方法和默认方法外,其余的都是
public的。属性默认是public static final修饰的
- 使用场景:
- 抽象类:当你想要共享代码的时候,并且有明确的类层次结构时,可以使用抽象类。
- 接口:当你在定义职责而不是共享代码时,可以使用接口,或者当你想要实现多重继承时。
- 实现方式:
- 抽象类:使用
extends关键字实现。 - 接口:使用
implements关键字实现。
- 抽象类:使用
- 方法实现:
- 抽象类:子类可以不实现抽象类中的所有抽象方法(除非子类也是抽象类)。
- 接口:实现接口的类必须实现接口中的所有方法(Java 8之前),或者使用
default关键字提供默认实现。