scala中的抽象类

50 阅读4分钟

在Scala中,抽象类是被abstract关键字修饰的类,它是一种不能直接实例化的类,主要用于定义子类的共同接口和部分实现,体现面向对象的抽象性和继承性。 抽象类可以包含抽象成员和具体成员。抽象成员包括抽象方法(未实现的方法,仅声明方法签名,无方法体)和抽象字段(未初始化的字段);具体成员则是有完整实现的方法或已初始化的字段。例如,抽象类Shape可声明抽象方法area(),同时包含具体方法printInfo()。 子类继承抽象类时,必须使用extends关键字,且必须实现抽象类中所有未实现的抽象成员(除非子类自身也是抽象类)。实现抽象方法时,需用override关键字显式标记,以明确表示对父类方法的重写。 抽象类可以有构造器(包括主构造器和辅助构造器),但子类继承时需遵循构造器调用规则。此外,抽象类可继承其他类或特质(trait),也可被多个子类继承,形成类层次结构。 与特质相比,抽象类更适合作为类层次的根节点,承载共性实现;而特质更侧重功能组合。在实际开发中,抽象类常用于定义具有明确继承关系的抽象概念,如动物、交通工具等,通过子类具体化不同实现,实现代码复用和多态特性。

一.理解抽象类

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

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

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

二.定义抽象类

定义一个Scala的抽象类:abstract class A{ }。

定义一个智能汽车类

scala
 体验AI代码助手
 代码解读
复制代码
abstract class AICar(){  
  def autoRun():Unit  
  var name:String  
}

定义抽象属性:var|val 属性名:类型 一个属性没有初始化,没有值

定义抽象方法:def 方法名():String 只声明没有实现方法。

三.抽象类的继承

子类继承了抽象类,它就必须去实现所有抽象属性和抽象方法

scala
 体验AI代码助手
 代码解读
复制代码
package A2

/*
* 抽象类 abstract
* 1.一个抽象类(加了abstract修饰的),不能被new
*   一个类不能用来创建对象,只能用来做父类
* */

abstract class AICar {
  //抽象方法
  def autoEn(): Unit
  //具体方法
  def autoDrive(): Unit = {
    println("具体方法,智能驾驶.....")
  }
}

class SU7 extends AICar {
  override def autoEn(): Unit = {
    println(s"采用小米独家的无线充电技术,停车就可以充电")
  }
}

object Class13 {
  def main(args: Array[String]): Unit = {
    // 抽象类不能实例化,以下代码注释掉
    // val car1 = new AICar()
    val su = new SU7()
    su.autoEn()
    su.autoDrive() // 可以调用父类的具体方法
  }
}

图示如下: Snipaste_2025-11-11_09-22-36.png

四.抽象类重写

如果子类中对抽象类中的方法定义不满意,仍可以使用override去覆盖的。

Snipaste_2025-11-11_10-16-54.png

代码如下:

scala
 体验AI代码助手
 代码解读
复制代码
package A2

/*
* 抽象类 abstract
* 1.一个抽象类(加了abstract修饰的),不能被new
*   一个类不能用来创建对象,只能用来做父类
*
* 2.可以定义抽象方法,在子类中去实现
*
* 3.一个抽象类中可以有:
*   1.具体属性 val name:String = "小米"
*   2.具体方法:def autoRun():Unit = {}
*   3.抽象属性:val name:String 没有具体值的属性。只有属性名和类型。他必须写在抽象类中
*   4.抽象方法:def autoRun():Unit
*              在子类中,要有具体的实现
*
* */

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

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

  //3.抽象属性(没有属性值)
  var price: Double  // 修正拼写错误:prcie -> price

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

class XiaoMi extends AICar {
  //重写具体属性
  name = "小米"
  //override val color = "流光紫"  // 父类是var,子类重写也需保持var

  //重写具体方法
  override def run(): Unit = {
    println("小米 run.....")
  }

  //实现抽象属性
  var price: Double = 28.8  // 明确类型,实现抽象属性

  //实现抽象方法
  override def autoRun(): Unit = {
    println("小米驾驶")
  }
}

object Class14 {
  def main(args: Array[String]): Unit = {
    // 测试子类实例
    val miCar = new XiaoMi()
    println(s"名称:${miCar.name},颜色:${miCar.color},价格:${miCar.price}万")
    miCar.run()
    miCar.autoRun()
  }
}