Java 抽象类和抽象方法语法知识点及案例代码

时间:2024-11-19 08:08:44

1. 抽象类和抽象方法的定义

抽象类

  • 抽象类是一个包含抽象方法的类,或者即使不包含抽象方法,但被设计为不能被实例化的类。
  • 抽象类使用 abstract 关键字修饰。
  • 抽象类不能被实例化,即不能创建它的对象实例,但可以作为其他类的基类。
  • 抽象类中可以包含成员变量、常量、抽象方法以及非抽象方法。
    抽象方法
  • 抽象方法是一个没有实现的方法,即没有方法体(没有大括号 {} 和其中的代码)。
  • 抽象方法通过 abstract 关键字来定义。
  • 抽象方法的主要作用是为子类提供一个规范或接口,强制子类必须实现这个方法。

2. 抽象类和抽象方法的声明格式

抽象类声明格式

public abstract class 类名 {
    成员变量;
    方法() { 方法体; } // 一般方法
    abstract 方法(); // 抽象方法
}

抽象方法声明格式

修饰符 abstract 返回值类型 方法名(参数列表);

3. 抽象类和抽象方法的特点

  • 抽象方法

    • 抽象方法只有声明,没有实现。
    • 抽象方法不能用 privatefinalstaticnative 修饰。
  • 抽象类

    • 抽象类不能被实例化,即使不包含抽象方法。
    • 抽象类中可以包含构造方法,供子类调用。
    • 抽象类中不一定包含抽象方法,但有抽象方法的类必定是抽象类。
    • 抽象类的子类必须实现父类中所有的抽象方法,否则子类也必须声明为抽象类。

4. 案例代码

以下是一个完整的示例,定义了一个抽象类 Shape,以及它的几个子类 CircleRectangleTriangle,分别计算不同形状的面积和周长。

// 抽象类 Shape
public abstract class Shape {
    // 抽象方法,计算面积
    public abstract double area();
    
    // 抽象方法,计算周长
    public abstract double perimeter();
    
    // 具体方法,描述形状
    public void describe() {
        System.out.println("This is a shape.");
    }
}

// 圆形类 Circle,继承 Shape 并实现抽象方法
public class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }

    @Override
    public double perimeter() {
        return 2 * Math.PI * radius;
    }
}

// 矩形类 Rectangle,继承 Shape 并实现抽象方法
public class Rectangle extends Shape {
    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double area() {
        return length * width;
    }

    @Override
    public double perimeter() {
        return 2 * (length + width);
    }
}

// 三角形类 Triangle,继承 Shape 并实现抽象方法
public class Triangle extends Shape {
    private double a, b, c;

    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    public double area() {
        double p = (a + b + c) / 2;
        return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }

    @Override
    public double perimeter() {
        return a + b + c;
    }
}

// 测试类
public class Test {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        Shape rectangle = new Rectangle(4, 6);
        Shape triangle = new Triangle(3, 4, 5);

        System.out.println("Circle area: " + circle.area());
        System.out.println("Circle perimeter: " + circle.perimeter());
        circle.describe();

        System.out.println("Rectangle area: " + rectangle.area());
        System.out.println("Rectangle perimeter: " + rectangle.perimeter());
        rectangle.describe();

        System.out.println("Triangle area: " + triangle.area());
        System.out.println("Triangle perimeter: " + triangle.perimeter());
        triangle.describe();
    }
}

5. 运行结果

运行上述测试类 Test,将会输出以下内容:

Circle area: 78.53981633974483
Circle perimeter: 31.41592653589793
This is a shape.
Rectangle area: 24.0
Rectangle perimeter: 20.0
This is a shape.
Triangle area: 6.0
Triangle perimeter: 12.0
This is a shape.

这个示例展示了如何使用抽象类和抽象方法来定义一个通用的接口,并在不同的子类中实现这些接口。
以下是一个使用