Java教程-详解 Java 抽象类和接口的区别

抽象类和接口都用于实现抽象,可以在它们中声明抽象方法。此外,它们都不能被实例化。然而,抽象类和接口之间存在许多区别,下面是一些主要区别:
抽象类 | 接口 |
---|---|
1)抽象类可以有抽象方法和非抽象方法。 | 接口只能有抽象方法。从 Java 8 开始,它也可以有默认方法和静态方法。 |
2)抽象类不支持多重继承。 | 接口支持多重继承。 |
3) 抽象类可以有最终的、非最终的、静态的和非静态的变量。 | 接口只有 static 和 final 变量。 |
4) 抽象类可以提供接口的实现。 | 接口不能提供抽象类的实现。 |
5)abstract关键字用于声明抽象类。 | interface关键字用于声明接口。 |
6) 一个抽象类可以扩展另一个Java类并实现多个Java接口。 | 一个接口只能扩展另一个 Java 接口。 |
7)可以使用关键字“extends”扩展抽象类。 | 可以使用关键字“implements”来实现接口。 |
8) Java抽象类可以有类成员,如 private、protected 等。 | 默认情况下,Java 接口的成员是公共的。 |
9)示例: public abstract class Shape{ public abstract void draw(); } | 例子: public interface Drawable{ void draw(); } |
简单地说,抽象类实现了部分抽象(0 到 100%),而接口实现了完全抽象(100%)。
Java中抽象类和接口的例子
让我们看一个同时使用接口和抽象类的简单示例。
//创建具有4个方法的接口
interface A{
void a();//bydefault, public and 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