抽象方法 详解
一、接口
1.1、接口的概念
1.2、接口的作用:
1.3、接口应用:
1.4、接口实践:
详情参考【java】《接口,抽象方法,抽象类 》之一 、接口详解
二、抽象方法
2.1、抽象方法概念
接口中的方法通常都是抽象方法,但自从 Java 8 开始,接口也可以包含默认方法(Default Method)和静态方法(Static Method)。抽象方法是一种没有具体实现的方法,它只有方法签名而没有方法体,需要由实现类提供具体的实现。
2.2、抽象方法的特点:
- 没有方法体:抽象方法只有方法声明,没有方法体。
- 必须由子类实现:抽象方法必须由子类提供具体的实现,否则子类也必须声明为抽象类。
- 用于定义行为规范:抽象方法通常用于定义一种行为规范,告诉子类应该具备的行为。
2.3、抽象方法的作用:
- 定义接口规范:抽象方法定义了接口或抽象类应该具备的行为,提供了一种规范约束。
- 实现多态:通过抽象方法,不同的子类可以提供自己特定的实现,从而实现多态。
2.4、抽象方法的应用:
- 接口定义:接口中的方法通常都是抽象方法,用于定义接口规范。
- 抽象类:抽象类中的方法可以是抽象方法,用于提供一种行为规范,而具体的实现交由子类实现。
- 继承:子类继承抽象类或实现接口时,必须提供抽象方法的具体实现。
2.5、抽象方法的实践:
考虑以下的示例,定义了一个 Shape
接口,其中包含一个抽象方法 calculateArea()
,用于计算图形的面积。具体的图形类(如圆、矩形)必须实现该方法来提供自己的面积计算逻辑:
// 定义接口
interface Shape {
double calculateArea(); // 计算形状的面积
}
// 实现接口
class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double calculateArea() {
return width * height;
}
}
// 使用接口
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
System.out.println("Circle area: " + circle.calculateArea());
Shape rectangle = new Rectangle(4, 6);
System.out.println("Rectangle area: " + rectangle.calculateArea());
}
}
在上述示例中,Shape
接口定义了 calculateArea()
抽象方法,Circle
和 Rectangle
类分别实现了该方法,提供了自己的面积计算逻辑。这样,无论是圆还是矩形,都可以通过统一的方法来计算它们的面积。
2.6、使用抽象方法的注意事项
在使用抽象方法时,有几个注意事项需要考虑:
- 抽象方法没有方法体 \color{green}{抽象方法没有方法体} 抽象方法没有方法体:抽象方法只有方法声明而没有方法体,因此在子类中必须提供具体的实现。
- 子类必须实现抽象方法 \color{green}{子类必须实现抽象方法} 子类必须实现抽象方法:如果一个类继承了抽象类或实现了接口,并且其中包含抽象方法,那么子类必须实现这些抽象方法,除非子类自己也声明为抽象类。
- 抽象方法不能是私有的或静态的 \color{green}{抽象方法不能是私有的或静态的} 抽象方法不能是私有的或静态的:抽象方法不能是私有的(private)或静态的(static),因为它们必须被子类重写。
- 抽象方法不能被 f i n a l 修饰 \color{green}{抽象方法不能被final修饰} 抽象方法不能被final修饰:抽象方法不能被 final 修饰,因为 final 修饰的方法不能被子类重写。
- 抽象方法可以被覆盖为非抽象方法 \color{green}{抽象方法可以被覆盖为非抽象方法} 抽象方法可以被覆盖为非抽象方法:一个抽象类中的抽象方法可以被它的子类实现为非抽象方法。这使得抽象类可以逐步完善,逐步提供默认实现。
- 抽象方法不能被覆盖为私有方法 \color{green}{抽象方法不能被覆盖为私有方法} 抽象方法不能被覆盖为私有方法:在 Java 9 之前,抽象方法不能被覆盖为私有方法,但可以被覆盖为默认方法或静态方法。
- 抽象方法的可见性 \color{green}{抽象方法的可见性} 抽象方法的可见性:抽象方法的可见性必须比其所在类的可见性更低,例如,如果一个类是 public 的,那么其抽象方法必须至少是 public 的,而不能是 protected 或 private 的。
- 接口默认方法 \color{green}{接口默认方法} 接口默认方法:Java 8 引入了接口默认方法(Default Method),它们为接口提供了具体的方法实现。实现类可以选择是否覆盖默认方法。
- 静态方法不是抽象方法 \color{green}{静态方法不是抽象方法} 静态方法不是抽象方法:静态方法在接口中不是抽象方法,它们可以有方法体,并且不需要在实现类中被覆盖。
在编写代码时,应该根据具体的需求和设计原则来合理使用抽象方法,确保代码的清晰、可读和易于维护。
三、抽象类
如果一个类继承了抽象类或实现了接口,并且其中包含抽象方法,**那么子类必须实现这些抽象方法,除非子类自己也声明为抽象类。**下面介绍一下抽象类。
3.1、抽象类的概念
3.2、抽象类的特点:
3.3、抽象类的作用:
3.4、抽象类的应用:
3.5、抽象类的注意事项:
详情参考【JAVA】《接口,抽象方法,抽象类 》之三 、抽象类详解
四、开发实践
4.1、定义接口:
4.2、实现抽象类:
4.3、创建具体实现类:
4.4、使用示例:
4.5、调用流程:
详情参考【JAVA】《接口,抽象方法,抽象类 》之四 、开发实践
订阅我的专栏,动动小手,点点关注,随学随更~