抽象类

抽象类使用 abstract 关键字声明,可以包含抽象方法(没有方法体)和具体方法。子类必须实现抽象方法。

抽象类
public abstract class Shape {
    protected String color;

    // 抽象方法:只有声明,没有实现
    public abstract double getArea();

    // 普通方法
    public void setColor(String color) {
        this.color = color;
    }
}

// 子类必须实现抽象方法
public class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

接口

接口定义行为规范,使用 interface 关键字。Java 8 之前接口方法不能有方法体,Java 8+ 支持 default 方法。

接口
// 接口定义行为规范
public interface Flyable {
    // 接口中的方法默认是 public abstract
    void fly();
    void land();
}

// 实现接口
public class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("鸟在天上飞");
    }

    @Override
    public void land() {
        System.out.println("鸟降落在树枝上");
    }
}

// 一个类可以实现多个接口
public class SuperMan implements Flyable, Runnable {
    // 实现所有接口的方法
}
💡 抽象类 vs 接口

抽象类:is-a 关系,表示一种类别,有构造方法,可以有成员变量
接口:has-a 能力,表示一种能力,无构造方法,变量默认是 static final
Java 8+ 接口可以有 default 方法实现。

课后练习

以下哪个关于接口的说法是正确的?

A 接口中的方法都有方法体
B 一个类可以实现多个接口
C 接口可以实例化
D 接口不能有常量