1. 抽象类和抽象方法的定义
抽象类:
- 抽象类是一个包含抽象方法的类,或者即使不包含抽象方法,但被设计为不能被实例化的类。
- 抽象类使用
abstract
关键字修饰。 - 抽象类不能被实例化,即不能创建它的对象实例,但可以作为其他类的基类。
- 抽象类中可以包含成员变量、常量、抽象方法以及非抽象方法。
抽象方法: - 抽象方法是一个没有实现的方法,即没有方法体(没有大括号
{}
和其中的代码)。 - 抽象方法通过
abstract
关键字来定义。 - 抽象方法的主要作用是为子类提供一个规范或接口,强制子类必须实现这个方法。
2. 抽象类和抽象方法的声明格式
抽象类声明格式:
public abstract class 类名 {
成员变量;
方法() { 方法体; } // 一般方法
abstract 方法(); // 抽象方法
}
抽象方法声明格式:
修饰符 abstract 返回值类型 方法名(参数列表);
3. 抽象类和抽象方法的特点
-
抽象方法:
- 抽象方法只有声明,没有实现。
- 抽象方法不能用
private
、final
、static
、native
修饰。
-
抽象类:
- 抽象类不能被实例化,即使不包含抽象方法。
- 抽象类中可以包含构造方法,供子类调用。
- 抽象类中不一定包含抽象方法,但有抽象方法的类必定是抽象类。
- 抽象类的子类必须实现父类中所有的抽象方法,否则子类也必须声明为抽象类。
4. 案例代码
以下是一个完整的示例,定义了一个抽象类 Shape
,以及它的几个子类 Circle
、Rectangle
和 Triangle
,分别计算不同形状的面积和周长。
// 抽象类 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.
这个示例展示了如何使用抽象类和抽象方法来定义一个通用的接口,并在不同的子类中实现这些接口。
以下是一个使用