抽象方法是没有主体的方法签名声明。 例如:
public abstract class Shape {
. . .
public abstract double getArea();
public abstract double getPerimeter();
}
方法Shape和getPerimeter()是抽象的。 由于Shape类具有抽象方法,因此也必须将其声明为abstract。 也可以在没有任何抽象方法的情况下将类声明为abstract。 当一个类是抽象的时,就不能创建它的一个实例。 一个人只能创建(具体)子类的实例。 具体类是未声明为抽象的类(因此没有抽象方法,并且实现了所有继承的抽象方法)。 例如:
public class Circle extends Shape {
public double radius;
. . .
public double getArea() {
return Math.PI * radius * radius;
}
public double getPerimeter() {
return 2.0 * Math.PI * radius;
}
}
这样做有很多原因。 一种方法是编写一种对于所有形状都相同的方法,但该方法取决于在Shape级别未知的特定于形状的行为。 例如,可以编写该方法:
public abstract class Shape {
. . .
public void printArea(PrintStream out) {
out.println("The area is " + getArea());
}
}
诚然,这是一个人为的示例,但它显示了基本思想:根据未指定的行为定义具体的行为。
拥有抽象类的另一个原因是,您可以部分实现接口。 接口中声明的所有方法均由实现该接口的任何类继承为抽象方法。 有时,您想在类中提供接口的部分实现,而将细节留给子类。 部分实现必须声明为抽象。