JavaTutorial

[TOC]

抽象类

抽象类的引入

现在我们已经了解了什么是继承,什么是多态,

那么有时会遇见一种情况:父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类取覆写它

比如上节课我留下的作业:

移动政务Java练习题参考答案2

里面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");
    }
}

能否用抽象类来约束静态方法?能否用抽象类来约束构造函数?试一试

抽象类中,仍然可以定义非抽象的方法,甚至有函数体的构造函数。这种构造函数由子类调用。