前言
我们在前一篇文章讲了继承和多态,如果说父类中的方法被子类重写后,再通过父类引用调用此方法则是调用的重写后的方法。那么原来父类中的方法是否实现就无所谓了,那么有没有一种类生来就是被继承的,然后重写其方法的呢?没错,他就是抽象类!🤩
一、抽象类的概念
在打印图形例子中, 我们发现, 父类 Shape
中的draw
方法好像并没有什么实际工作, 主要的绘制图形都是由 Shap
e的各种子类的 draw
方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstractmethod), 包含抽象方法的类我们称为 抽象类(abstract class).
二、抽象类的语法
语法会涉及到一个关键字 -> abstract
被 abstract
修饰的方法是抽象方法,被 abstract
修饰的类是抽象类,值得一提的是抽象方法一定在抽象类中,而抽象类中不是非要有抽象方法滴!
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
// 抽象类:被abstract修饰的类
public abstract class Shape {
// 抽象方法:被abstract修饰的方法,没有方法体
abstract public void draw();
abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}
三、抽象类的特性
1、抽象类不能直接实例化对象
Shape shape = new Shape();
2、抽象方法不能被private
修饰
3、抽象方法不能被final和static修饰,因为抽象方法要被子类重写
4、抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
四、抽象类的作用
抽象类的存在相当于让编译器给我们多加了一层校验,
例如:
使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.
其实很多的语法存在的意义就是为了“预防出错”,像定义一个常量用final修饰,如果改变其值的话编译器就会报错等等