抽象类和接口之间的区别是一个流行的问试问题。抽象类和接口是java编程语言的核心部分。是选择接口还是抽象类是每个架构师都面临的设计决策。
在本系列Java教程中,提供了有关java接口和抽象类的讲解和示例。
抽象类和接口都用于实现抽象,可以声明抽象方法。抽象类和接口都不能被实例化。但是在下面给出的抽象类和接口之间有许多区别。
抽象类 | 接口 |
---|---|
抽象类可以有抽象和非抽象方法。 | 接口只能有抽象方法。从Java 8开始,它也可以有默认和静态方法。 |
抽象类不支持多重继承。 | 接口支持多继承。 |
抽象类可以有final ,非final ,静态和非静态变量。 |
接口只有静态和final 变量。 |
抽象类可以提供接口的实现。 | 接口不能提供抽象类的实现。 |
abstract 关键字用来声明抽象类。 |
interface 关键字用于声明接口。 |
简单地说,抽象类实现了部分抽象(0到100%),而接口实现了完全抽象(100%)。
使用抽象类和接口
在大多数时候,使用接口和抽象类是设计系统的最佳方法,例如在JDK中java.util.List
是一个包含很多方法的接口,因此有一个抽象类 - java.util.AbstractLis
为List
接口的所有方法提供基础实现,以便任何子类都可以扩展此类并仅实现所需的方法。
应该始终以接口为基础并在定义每个子类时都应该实现方法,如果有一些方法只应该实现某些子类,可以扩展基接口并使用这些方法创建一个新接口。子类可以选择在基接口或子接口之间进行选择,以根据其要求实现。如果方法的数量增长很多,那么提供一个实现子接口的骨架抽象类并为子类提供在接口和抽象类之间进行选择的灵活性也是一个不错的做法。
Java抽象类和接口的示例
让我们来看看下面一个简单的例子,使用接口和抽象类。
//创建具有4种方法的接口
interface A {
void a();// 默认使用修辞符是:public 和 abstract
void b();
void c();
void d();
}
// 创建实现接口A的方法的抽象类
//
abstract class B implements A {
public void c() {
System.out.println("I am C");
}
}
// 创建抽象类的子类,需要提供抽象类方法的实现
class M extends B {
public void a() {
System.out.println("I am a");
}
public void b() {
System.out.println("I am b");
}
public void d() {
System.out.println("I am d");
}
}
// 创建一个调用A接口方法的测试类
class Test5 {
public static void main(String args[]) {
A a = new M();
a.a();
a.b();
a.c();
a.d();
}
}
执行上面的示例代码,得到以下结果 -
I am a
I am b
I am c
I am d