抽象类和接口
抽象类
public abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public abstract void makeSound(); // 抽象方法
public void eat() {
System.out.println(name + " is eating.");
}
}
接口
public interface Animal {
// public static final String name = "Dog";
String name = "Dog"; // 静态常量
// public void makeSound();
void makeSound(); // 抽象方法
// Java 8
default void sleep() { // 默认方法
System.out.println("Zzz...");
}
static void greet() { // 静态方法
System.out.println("Hello!");
}
// Java 9
private void innerMethod() { // 私有方法,用于支持接口中其他方法
System.out.println("emm...");
}
}
相同点
- 抽象性
都可以包含抽象方法,不能直接实例化。需要派生子类(抽象类被子类继承,抽象方法被子类实现) - 多态性
抽象类通过被子类extends实现多态,接口通过被子类implement实现多态
不同点
-
继承与实现:
一个类只能继承一个抽象类。
一个类可以实现多个接口。 -
思想
抽象类本质是类,适合做父类模板
接口更适合做功能的解耦合
抽象类:
- 适合做父类模板。
- 可以包含构造器、字段、抽象方法和非抽象方法。
- 适合定义一系列相关类的公共行为和状态。
接口:
- 用于定义行为规范和契约。
- 定义了一组方法的签名,而不提供这些方法的具体实现。
- 适合用于定义多个类之间的行为一致性。