抽象类与抽象方法

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 抽象类和抽象方法是面向对象编程中的重要概念。抽象类不能被实例化,主要用于定义子类的通用接口或行为。抽象方法是在抽象类中声明但未实现的方法,要求子类必须实现这些方法。这种方式有助于构建灵活且可扩展的代码结构。
  1. 抽象类的概念与定义

    • 概念:抽象类是一种不能被实例化的类,它主要用于为其他类提供一个通用的模板或者说是蓝图。抽象类通常包含抽象方法和非抽象方法,抽象方法是没有具体实现的方法,必须在子类中实现,非抽象方法则有具体的实现。
    • 定义格式(以Java为例)
      abstract class AbstractClass {
             
      // 非抽象方法
      public void nonAbstractMethod() {
             
         System.out.println("This is a non - abstract method.");
      }
      // 抽象方法
      public abstract void abstractMethod();
      }
      
    • 在这个例子中,AbstractClass是一个抽象类,它包含一个非抽象方法nonAbstractMethod和一个抽象方法abstractMethod。抽象类使用abstract关键字进行修饰。
  2. 抽象方法的概念与定义

    • 概念:抽象方法是一种没有方法体(没有具体实现代码)的方法声明,它只定义了方法的签名(包括方法名、参数列表和返回类型)。抽象方法必须存在于抽象类或者接口中,其目的是强制子类去实现该方法,以提供具体的行为。
    • 定义格式(以Java为例)
      public abstract 返回类型 方法名(参数列表);
      
    • 例如,在上面的AbstractClass中的abstractMethod就是一个抽象方法。它没有方法体,只有方法签名。
  3. 抽象类与抽象方法的作用

    • 代码复用与模板设计:抽象类提供了一种代码复用的机制,通过将通用的方法(非抽象方法)放在抽象类中,子类可以继承这些方法,避免重复编写代码。同时,抽象方法作为一种模板,规定了子类必须实现的行为,使得子类的实现具有一致性。例如,在一个图形绘制系统中,可以定义一个抽象类Shape
      abstract class Shape {
             
      public abstract double calculateArea();
      public void printArea() {
             
         double area = calculateArea();
         System.out.println("The area of the shape is: " + area);
      }
      }
      
    • 在这里,calculateArea是抽象方法,不同的图形(如圆形、三角形等)子类必须实现这个方法来计算自己的面积。而printArea是非抽象方法,它利用calculateArea方法计算出的面积进行打印。这样,无论是圆形子类还是三角形子类,都可以复用printArea方法。
    • 多态性的支持:抽象类和抽象方法是实现多态性的重要手段。通过抽象类引用指向不同的子类对象,可以调用不同子类实现的抽象方法,从而实现不同的行为。例如,有CircleTriangle两个子类继承自Shape抽象类:
      class Circle extends Shape {
             
      private double radius;
      public Circle(double radius) {
             
         this.radius = radius;
      }
      @Override
      public double calculateArea() {
             
         return Math.PI * radius * radius;
      }
      }
      class Triangle extends Shape {
             
      private double base;
      private double height;
      public Triangle(double base, double height) {
             
         this.base = base;
         this.height = height;
      }
      @Override
      public double calculateArea() {
             
         return 0.5 * base * height;
      }
      }
      
    • 可以通过以下方式使用多态性:
      Shape shape1 = new Circle(2.0);
      Shape shape2 = new Triangle(3.0, 4.0);
      shape1.printArea();
      shape2.printArea();
      
    • 在这个例子中,shape1shape2都是Shape类型的引用,但它们分别指向CircleTriangle的对象。当调用printArea方法时,会根据对象的实际类型(多态性)调用相应子类实现的calculateArea方法,从而计算并打印出不同图形的面积。
  4. 抽象类与接口的对比(与抽象概念相关部分)

    • 抽象程度:抽象类可以包含抽象方法和非抽象方法,提供了一种部分实现的模板。而接口中的方法全部是抽象方法(在Java 8之前),更加纯粹,它定义了一组行为规范,不包含任何实现细节。
    • 继承与实现:一个类只能继承一个抽象类,但可以实现多个接口。这使得接口在定义多个不相关的行为规范时更加灵活。例如,一个类可以实现一个用于数据存储的接口和一个用于数据打印的接口,而如果使用抽象类,可能会导致复杂的继承关系。
    • 默认方法(Java 8特性):接口从Java 8开始可以有默认方法,这些方法有默认的实现。这使得接口在一定程度上可以像抽象类一样提供一些通用的实现,但接口的默认方法主要是为了方便在不破坏已有实现类的情况下添加新的方法,而抽象类的非抽象方法更多是作为模板的一部分供子类复用。
相关文章
|
15天前
抽象类
作用:类似“模板”,其目的是要设计者依据它的格式来修改并创建新的类,但是并不能直接由抽象类创建对象,只能通过抽象类派生出新的类,再由它来创建对象,只能单继承 定义及使用规则: 1)包含一个抽象方法的类必须是抽象类 2)抽象类和抽象方法都要使用abstract关键字声明 3)抽象方法只需声明而不需要实现 4)抽象类必须被子继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法
16 0
|
7月前
|
C++
C++程序中的抽象类
C++程序中的抽象类
80 0
|
7月前
|
程序员 C#
C#抽象类和抽象方法详解
C#抽象类和抽象方法详解
69 0
|
7月前
|
存储
抽象类为什么有抽象方法?
抽象类为什么有抽象方法?
|
Java 编译器
认识抽象类
认识抽象类
87 0
|
程序员 C# 索引
知识回顾:抽象类与抽象方法
知识回顾:抽象类与抽象方法
113 0
抽象类和抽象方法
抽象方法abstract public void Func();声明了abstract 不能有函数体 声明了virtual可以有函数体
526 0