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

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

Java 中可以定义一些不含方法体的方法。它的方法体的实现交给该类的子类自己去完成,这样的方法就是抽象方法。包含抽象方法的类必须是抽象类。

Java 中提供了 abstract 关键字,表示抽象的意思。用 abstract 修饰的方法,称为抽象方法。抽象方法只有方法的声明,没有方法体。

任何包含抽象方法的类都必须声明为抽象类,但是抽象类不一定必须包含抽象方法。

定义抽象类和抽象方法的语法格式如下:
【修饰符】abstract class 类名 {
    【修饰符】abstract 方法返回值类型 方法名(【参数列表】);
    // 其他类的成员
}

例如:
abstract class Employee {
    public abstract earnings();
}

使用抽象类和抽象方法时要满足的规则如下:
下面给出一个抽象类的实例,体会一下抽象类和抽象方法的定义,以及子类如何实现父类抽象方法的重写。

功能实现:Shape 类是对现实世界形状的抽象,Rectangle 和 Circle 是 Shape 类的两个子类,分别代表现实中两种具体的形状。在子类中根据不同形状的特点计算不同子类对象的面积。
abstract class Shape { // 定义抽象类
    protected double length = 0.0d;
    protected double width = 0.0d;
    Shape(double len, double w) {
        length = len;
        width = w;
    }
    abstract double area(); // 抽象方法,只有声明,没有实现
}

class Rectangle extends Shape {
    /**
     * @param num 传递至构造方法的参数
     * @param num1 传递至构造方法的参数
     */
    public Rectangle(double num, double num1) {
        super(num, num1); // 调用父类的构造函数,将子类长方形的长和宽传递给父类构造方法
    }
    /**
     * 计算长方形的面积。
     * @return double
     */
    double area() { // 长方形的 area 方法,重写父类 Shape 的方法
        System.out.println("长方形的面积为:");
        return length * width;
    }
}

class Circle extends Shape { // 圆形子类
    /**
     * @param num 传递至构造方法的参数
     * @param num1 传递至构造方法的参数
     * @param radius 传递至构造方法的参数
     */
    private double radius;
    public Circle(double num, double num1, double r) {
        super(num, num1); // 调用父类的构造上函数,将子类圆的圆心位置和半径传递
        radius = r;
    }
    /**
     * 计算圆形的面积。
     * @return double
     */
    double area() { // 圆形的 area 方法,重写父类 Shape 的方法
        System.out.println("圆形位置在(" + length + "," + width + ")的圆形面积为:");
        return 3.14 * radius * radius;
    }
}

public class Main {
    public static void main(String args[]) {
        // 定义一个长方形对象,并计算长方形的面积
        Rectangle rec = new Rectangle(15, 20);
        System.out.println(rec.area());
        // 定义一个圆形对象,并计算圆形的面积
        Circle circle = new Circle(15, 15, 5);
        System.out.println(circle.area());
        // 父类对象的引用指向不同的子类对象的实现方式
        Shape shape = new Rectangle(15, 20);
        System.out.println(shape.area());
        shape = new Circle(15, 15, 5);
        System.out.println(shape.area());
    }
}
程序运行结果为:

长方形的面积为:
300.0
圆形位置在(15.0,15.0)的圆形面积为:
78.5
长方形的面积为:
300.0
圆形位置在(15.0,15.0)的圆形面积为:
78.5

抽象类 Shape 是对现实世界中不同形状的抽象,其两个数据成员 length 和 width 代表通用形状的长和宽或某个点的位置坐标,并声明一个抽象的方法 area(),语句如下:
abstract double area();
这是个抽象方法,只有声明,没有实现,代表该形状面积的计算,需在不同的子类——即各种具体形状中实现。

子类 Rectangle 代表长方形,长方形的长宽来自对父类的继承,方法 area() 重写父类抽象的方法area(),从而实现长方形对象面积的计算。

下面代码显示方法 area() 的重写过程:
double area() { // 长方形的 area 方法,重写父类 Shape 的方法
    System.out.print("长方形的面积为:");
    return length * width;
}

子类 Circle 代表圆形,圆形的坐标位置来自对父类中数据成员 length 和 width 的继承,方法 area() 重写父类抽象的方法 area(),从而实现圆形对象面积的计算。下面代码显示方法 area() 的重写过程:
double area() { // 圆形的 area 方法,重写父类 Shape 的方法
    System.out.print("圆形位置在(" + length + "," + width + ")的圆形面积为:");
    return 3.14 * radius * radius;
}
TestShape 的 main() 方法中声明 Rectangle 和 Circle 类的对象,分别实现各自对象面积的计算。

相关文章