接口 (Interface)
特点
- 完全抽象:接口中的所有方法都是抽象的(在Java 8之前)。从Java 8开始,接口可以包含默认方法和静态方法。
- 方法:接口中的方法默认是
public
和abstract
,不允许有实现(默认方法和静态方法除外)。 - 字段:接口中的字段默认是
public
、static
和final
的,必须是常量。 - 实现:类可以实现多个接口,即Java支持多重继承接口。
- 设计意图:接口用于定义类应该遵循的合同或行为,而不关心类的实现。
示例
public interface Animal {
void eat();
void sleep();
}
抽象类 (Abstract Class)
特点
- 部分抽象:抽象类可以包含抽象方法和具体方法。
- 方法:抽象类可以有抽象方法(没有实现)和具体方法(有实现)。
- 字段:抽象类可以有实例变量,可以定义非
public
、non-static
、non-final
字段。 - 继承:类只能继承一个抽象类,即Java不支持多重继承类。
- 设计意图:抽象类用于表示一种泛化关系,可以提供一些默认的行为或状态。
示例
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public abstract void eat();
public void sleep() {
System.out.println(name + " is sleeping");
}
}
关键区别
-
抽象级别:
- 接口是完全抽象的(在Java 8之前),不包含任何具体实现。
- 抽象类可以部分抽象,允许包含具体实现。
-
字段:
- 接口中只能有
public
、static
、final
字段,即常量。 - 抽象类中可以有任何访问修饰符的实例变量。
- 接口中只能有
-
方法:
- 接口中方法默认是
public
和abstract
,Java 8引入了默认方法(default
)和静态方法(static
)。 - 抽象类可以包含抽象方法和具体方法,具体方法可以有实现。
- 接口中方法默认是
-
多继承:
- 一个类可以实现多个接口,这实现了多重继承接口。
- 一个类只能继承一个抽象类。
-
构造方法:
- 接口没有构造方法,因为接口不能直接实例化。
- 抽象类可以有构造方法,虽然不能直接实例化,但子类可以调用其构造方法。
-
用途:
- 接口用于定义类应该提供的功能,而不指定功能的实现方式。它更像是一种契约或协议。
- 抽象类用于提供一个通用的基础结构,可以包含默认行为或状态,子类可以继承和扩展这些行为。
使用场景
-
接口:
- 当你希望定义一组无关类可以实现的行为时使用接口。
- 当你需要多重继承时使用接口。
- 当你希望确保实现类提供特定的行为,但不关心如何实现时使用接口。
-
抽象类:
- 当你希望在类之间共享代码时使用抽象类。
- 当你需要为子类提供一些默认行为或状态时使用抽象类。
- 当你需要控制继承的过程,且不需要多重继承时使用抽象类。