抽象类
1 语法规则
在上文5.1的示例中,父类Shape中的draw方法好像并没有什么实际的工作,主要的画图都是由Shape中的各种子类的draw方法来完成的,像这种没有实际工作的方法,我们可以把它设计成一个抽象方法(abstract method),包含抽象方法的类我们称之为抽象类(abstract class).
abstract class Shape {
  abstract public void draw();
}
- 在draw方法前加上abstract关键字,表示这是一个抽象方法;
- 抽象方法没有方法体({ }),不能执行具体的代码;
- 对于包含抽象方法的类,必须加上abstract关键字,表示这是一个抽象类.
2 注意事项
- 抽象类不能直接实例化;
- 抽象方法不能private;
- 抽象类中可以包含其他的非抽象方法,也可以包含字段,这个非抽象方法和普通方法的规则都是一样的,可以被重写,也可以被子类直接调用.
abstract class Shape {
abstract public void draw();
public void func() {
System.out.println("抽象类中的非抽象方法!");
}
}
class Bird extends Shape {
@Override
public void draw() {
}
}
public class TestDemo {
public static void main(String[] args) {
Shape shape = new Bird();
shape.func();
}
}
运行结果:
3 抽象类的作用
- 抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法;
- 抽象类存在的最大意义就是为了被继承;
- 使用抽象类相当于多了一重编译器的校验,实际工作不应该由父类完成,而应该由子类完成,如果误用父类了,使用普通编译器是不会报错的,但是父类如果是抽象类的话,就会在实例化的时候提示错误,让我们能尽早发现问题.