[TOC]
现在我们已经了解了什么是继承,什么是多态,
那么有时会遇见一种情况:父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类取覆写它
比如上节课我留下的作业:
里面BaseObject是三角形,圆形,和正方形的父类,但你很难说这个父类有什么实际的用途
那么,可以把父类的方法声明为抽象方法:
class BaseObject {
public abstract double getArea();
}
把一个方法声明为abstract方法,表示它是一个抽象方法,本身没有实现任何方法语句。
因为这个抽象方法本身是无法执行的,所以,Person类也无法被new
表达式实例化,编译器会告诉我们无法编译Person类,因为它包含抽象方法。后面会讲到不写出子类,也可以实例化抽象类的语法。
必须把Person类也声明为abstract,才能正确编译它:
abstract class BaseObject {
public abstract double getArea();
}
如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。
因为无法执行抽象方法,因此这个类也必须声明为抽象类
使用abstract修饰的类就是抽象类。我们无法通过调用构造函数来实例化一个抽象类:
BaseObject obj = new BaseObject(); //编译错误
无法实例化的抽象类有什么作用?
因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错,因此,抽象方法实际上相当于定义了“规范”。
public class Main {
public static void main(String[] args) {
Person p = new Student();
p.run();
}
}
abstract class Person {
public abstract void run();
}
class Student extends Person {
@Override
public void run() {
System.out.println("Student.run");
}
}
能否用抽象类来约束静态方法?能否用抽象类来约束构造函数?试一试
抽象类中,仍然可以定义非抽象的方法,甚至有函数体的构造函数。这种构造函数由子类调用。