Scala抽象类完全指南:从基础到实战应用

115 阅读4分钟

前面我们学习了类的继承,下面我们看一种专为继承而生的类:抽象类。

在Scala面向对象编程中,抽象类是实现代码复用和多态性的重要工具。本文将通过多个实际案例,深入解析Scala抽象类的使用方法、特性以及实际应用场景。

理解抽象类

类本身就是对对象的抽象,抽象类就是对类的抽象,就是一种更加模糊的类。

定义

抽象类是一个包含一个或多个抽象方法的类。抽象方法是不带任何实现的方法。抽象类也可以包含具体的方法和属性。

目的

抽象类的主要目的是为子类提供公共的接口和部分实现,并确保子类实现抽象方法。

定义抽象类

定义一个Scala的抽象类

abstract class A{ }。

基础抽象类实现

基础抽象类与抽象方法

package level02

/*
*   抽象类
*    1. 一个抽象类,不能被new
*       一个类不能直接用来创建对象,那么这个类具体有什么用呢? 做别人的父亲!
*    2. 可以定义抽象方法,在子类中去实现
* */
object base2702 {

  abstract class AICar {
    // 抽象方法:没有具体的函数代码。
    def autoEn():Unit

    // 具体方法
    def autoDrive () :Unit = {
      println("具体方法,自动驾驶......")
    }
  }

  // 在子类中,一定要去实现父类的所有抽象方法
  class SU7 extends AICar{

    // 使用 去实现这个方法
    override def autoEn(): Unit = {
      println(s"采用小米独家的无线充电技术,停车就可以充电")
    }

  }

  def main(args: Array[String]): Unit = {

   // val car1 = new AICar()
    val su = new SU7
    su.autoEn()
  }
}

运行结果

1.png

代码分析

  • abstract class 表示这是一个抽象类,不能直接实例化(即不能用 new AICar() 创建对象)。
  • def autoEn():Unit 是抽象方法因此没有具体的函数代码。
  • def autoDrive(): Unit = {...} 是具体方法,有明确的逻辑(打印 “具体方法,自动驾驶……”),子类可直接继承使用。
  • class SU7 extends AICar 表示 SU7 是 AICar 的子类,通过 extends 实现继承。
  • override def autoEn(): Unit = {...} 中,override 关键字明确表示这是对父类抽象方法的重写,必须实现父类所有抽象方法(否则编译报错)。

抽象属性与构造器参数

抽象属性与构造器参数的使用

package level02

object base2703 {

  /* // 方法一:
  abstract class AICar {
    val name: String  // 抽象属性

    def autoRun(): Unit  // 抽象方法
  }

  // 在子类中,一定要去实现父类的所有抽象方法
  class XiaoMi extends AICar {
    val name: String = "xiaomi"

    def autoRun(): Unit = {
      println("小米汽车,自动驾驶......")
    }
  }

  def main(args: Array[String]): Unit = {
      var car1 = new XiaoMi
      car1.autoRun()
    }
  */
  
  // 方法二:使用构造器参数
  abstract class AICar(val name: String) {
    def autoRun(): Unit
  }

  // 在子类中,一定要去实现父类的所有抽象方法
  class XiaoMi(name: String, val brandName: String) extends AICar(name) {

    def autoRun(): Unit = {
      println(s"${brandName}汽车,自动驾驶......")
    }
  }

  def main(args: Array[String]): Unit = {
    val car1 = new XiaoMi("SU7", "小米")
    car1.autoRun()
  }
}

运行结果

1.png

代码解析

  • 方法一:在抽象类中定义抽象属性,子类中实现
  • 方法二:通过构造器参数传递属性值,更加灵活
  • 两种方法都能实现相同的功能,根据具体需求选择

完整抽象类特性展示

Snipaste_2025-11-13_20-22-36.png

抽象类的完整成员构成

package level02

object base2704 {

  abstract class AICar() {
    // 1. 具体属性
    var name: String = "car"
    val color: String = "black"

    // 2. 具体方法
    def run(): Unit = {
      println(" AICar run......")
    }

    // 3. 抽象属性 - 没有属性值
    var price: Double

    // 4. 抽象方法 - 没有方法体
    def autoRun(): Unit
  }

  class XiaoMi extends AICar {
    // 重写
    // 1. 具体属性
    name = "小米"  // 对于var的属性,直接覆盖
    
    // 2. 具体方法
    override def run(): Unit = {
      println("小米 run.....")
    }
    
    // 实现
    // 3. 实现抽象属性
    var price = 28.8
    
    // 4. 实现抽象方法
    def autoRun(): Unit = {
      println("小米自动驾驶")
    }
  }

  def main(args: Array[String]): Unit = {
    var c1 = new XiaoMi()
    c1.autoRun()
    c1.run()
    println(c1.name)
    println(c1.color)
  }
}

运行结果

2.png

代码解析

  • 抽象类可以包含四种成员:

    • 具体属性:已初始化的属性
    • 具体方法:已实现的方法
    • 抽象属性:只有声明没有初始化的属性
    • 抽象方法:只有声明没有实现的方法
  • 子类必须实现所有抽象成员

  • 具体成员可以继承或重写