Java抽象类(abstract)的用法(附带实例)
抽象(abstract)是指将众多具体事物中共同的、本质的特征属性抽取出来,屏蔽繁杂不同的内部实现,从而形成非具体的概念。
学习抽象类之前,读者见过的所有 Java 类都属于具体的类,也就是说必须把 Java 类的所有方法的具体实现都描述清楚。
然而,除了具体类还有一种 Java 类称为抽象类。如果对于某个类的某些方法的实现没有具体描述,那么这个类就是抽象类。Java 中的抽象指的是对方法的抽象。
要将一个类声明为抽象类很简单,语法如下所示:
抽象类具有如下特点:
要理解抽象类出现的原因就要先看没有抽象类时会遇到什么问题。前面我们学习了 Java 具有多态性,它是由方法重写来实现的。实例代码如下:
为了解决上述问题,Java 引入了抽象类,实例代码如下:
学习抽象类之前,读者见过的所有 Java 类都属于具体的类,也就是说必须把 Java 类的所有方法的具体实现都描述清楚。
然而,除了具体类还有一种 Java 类称为抽象类。如果对于某个类的某些方法的实现没有具体描述,那么这个类就是抽象类。Java 中的抽象指的是对方法的抽象。
要将一个类声明为抽象类很简单,语法如下所示:
访问修饰符 abstract class 类名 { 访问修饰符 abstract 返回类型 方法名(参数列表); }正常定义一个类并在关键字 class 前面加上 abstract 关键字,然后在类里面将需要抽象的方法的前面也添加 abstract 关键字。
抽象类具有如下特点:
- Java 中只能将类或方法声明为抽象,变量是不能声明为抽象的;
- 类和方法都通过 abstract 关键字来声明为抽象;
- 声明方法为抽象时必须同时将其所属类声明为抽象,否则会导致编译报错;
- 抽象方法没有方法体;
- 抽象类中声明的所有抽象方法在子类中都必须全部重写;
- 我们无法创建抽象类的对象,通过 new 来实例化抽象类时会导致编译报错。
要理解抽象类出现的原因就要先看没有抽象类时会遇到什么问题。前面我们学习了 Java 具有多态性,它是由方法重写来实现的。实例代码如下:
class Shape { float calcArea(float height, float width) { return 0f; } } class Triangle extends Shape { float calcArea(float height, float width) { return height * width / 2; } } class Rectangle extends Shape { float calcArea(float height, float width) { return height * width; } }Triangle 类和 Rectangle 类都继承了 Shape 父类,我们会发现真正有用的是 Triangle 类和 Rectangle 类的两个 calcArea() 方法,而 Shape 类的 calcArea() 方法是不起作用的,那么能不能把它去掉呢?答案是不能,因为我们要实现多态机制。所以这个方法必须存在,至于方法体则可以随便写或不写。
为了解决上述问题,Java 引入了抽象类,实例代码如下:
abstract class Shape { abstract float calcArea(float height, float width); } class Triangle extends Shape { float calcArea(float height, float width) { return height * width / 2; } } class Rectangle extends Shape { float calcArea(float height, float width) { return height * width; } }程序中我们将 Shape 类声明为 abstract 且其中的 calcArea() 方法也声明为 abstract。此时就可以不用编写 Shape 类的 calcArea() 方法体,仅声明该方法即可。