1、主要区别
特性 | 接口(Interface) | 抽象类(Abstract Class) |
---|---|---|
定义方式 | 使用interface 关键字 | 使用abstract class 关键字 |
方法实现 | Java 8前不能有实现(默认方法除外) | 可以有具体方法和抽象方法 |
变量 | 默认public static final (常量) | 可以是普通变量 |
构造方法 | 不能有 | 可以有 |
多继承 | 一个类可实现多个接口 | 一个类只能继承一个抽象类 |
访问修饰符 | 方法默认public | 方法可以有各种访问修饰符 |
设计目的 | 定义行为规范 | 提供部分实现,作为基类 |
2、使用场景
2.1 使用接口的情况:
- 需要定义一组行为规范,让不同类实现
- 需要多重继承行为时
- 需要定义回调机制时
- 希望实现松耦合设计时
// 接口示例
public interface Drawable {
void draw(); // 抽象方法
default void resize() { // Java 8默认方法
System.out.println("Resizing...");
}
}
class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
2.1 使用抽象类的情况:
- 多个相关类共享代码时
- 需要有非final变量时
- 需要控制子类的访问权限时
- 需要定义模板方法模式时
// 抽象类示例
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public abstract void makeSound();
public void eat() {
System.out.println(name + " is eating");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
3、Java 8及以后的接口增强
从Java 8开始,接口可以包含:
- 默认方法(default methods) - 提供默认实现
- 静态方法(static methods) - 接口级别的工具方法
public interface Vehicle {
// 抽象方法
void start();
// 默认方法
default void stop() {
System.out.println("Vehicle stopped");
}
// 静态方法
static void honk() {
System.out.println("Honk honk!");
}
}
4、设计建议
- 优先考虑接口 - 因为Java不支持多重继承,接口更灵活。
- 当需要共享代码时使用抽象类。
- 接口适合定义**“能做什么”**(行为)
- 抽象类适合定义**“是什么”**(本质)
- 考虑使用**“接口+抽象类”**的组合模式,接口定义行为,抽象类提供部分实现。