接口和抽象类区别
# 总结
相同点:
- 都不能被实例化
- 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化
不同点:
- 定义的关键字不同。
- 子类继承或实现关键字不同。
- 类型扩展不同:抽象类是单继承,而接口是多继承。 实现的两边均无限制。
- 属性访问控制符:抽象类无限制,而接口有限制,接口默认的是 public 控制符。
- 方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符。
- 方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法(抽象方法)不能有实现,但在 JDK 8 中的 static 和 defualt 方法必须有实现。
- 静态代码块的使用不同:抽象类可以有静态代码块,而接口不能有。
- 还有:
抽象类可以有构造器,接口不能有构造器; 抽象类可以有main方法并且允许,接口不行。
# 区别1:定义关键字不同
接口使用关键字 interface 来定义。抽象类使用关键字 abstract 来定义。
# 区别2:继承或实现的关键字不同
接口使用 implements 关键字定义其具体实现。抽象类使用 extends 关键字让子类继承。
# 区别3:子类扩展的数量不同
类只能继承一个父类(单继承),接口可以继承多个接口(多继承)
可以多个类实现一个接口,也可以一个类实现多个接口
# 区别4:属性访问控制符不同
接口中属性的访问控制符只能是 public,如下图所示:
接口中的属性默认是 public static final 修饰的。
抽象类中的属性访问控制符无限制,可为任意控制符,如下图所示:
# 区别5:方法访问控制符不同
接口中方法的默认控制符是 public,并且不能定义为其他控制符,如下图所示:
抽象类中的方法控制符无限制,其中抽象方法不能使用 private 修饰,如下代码所示:
# 区别6:方法实现不同
接口中普通方法(就是抽象方法,省略了abstract)不能有具体的方法实现,在 JDK 8 之后 static 和 default 方法必须有方法实现,如下代码所示:
从上述结果可以看出:static 或 default 方法如果没有方法实现就会报错,而普通方法如果有方法实现就会报错。
抽象类中普通方法可以有方法实现,抽象方法不能有方法实现,如下代码所示:
从上述结果可以看出:抽象类中的普通方法如果没有方法实现就会报错,而抽象方法如果有方法实现则会报错。
# 区别7:静态代码块使用不同
接口中不能使用静态代码块,如下代码所示:
抽象类中可以使用静态代码块,如下代码所示:
编辑 (opens new window)
上次更新: 2023/05/26, 15:58:27