定义规范,让子类或实现类去具体实现
抽象类使用 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 {
// 实现所有接口的方法
}
抽象类:is-a 关系,表示一种类别,有构造方法,可以有成员变量
接口:has-a 能力,表示一种能力,无构造方法,变量默认是 static final
Java 8+ 接口可以有 default 方法实现。