首页 > 编程笔记 > Java笔记 阅读:13

Java抽象类(abstract)的用法(附带实例)

抽象(abstract)是指将众多具体事物中共同的、本质的特征属性抽取出来,屏蔽繁杂不同的内部实现,从而形成非具体的概念。

学习抽象类之前,读者见过的所有 Java 类都属于具体的类,也就是说必须把 Java 类的所有方法的具体实现都描述清楚。

然而,除了具体类还有一种 Java 类称为抽象类。如果对于某个类的某些方法的实现没有具体描述,那么这个类就是抽象类。Java 中的抽象指的是对方法的抽象。

要将一个类声明为抽象类很简单,语法如下所示:
访问修饰符 abstract class 类名 {
    访问修饰符 abstract 返回类型 方法名(参数列表);
}
正常定义一个类并在关键字 class 前面加上 abstract 关键字,然后在类里面将需要抽象的方法的前面也添加 abstract 关键字。

抽象类具有如下特点:
要理解抽象类出现的原因就要先看没有抽象类时会遇到什么问题。前面我们学习了 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() 方法体,仅声明该方法即可。

相关文章