scala的trait(特质)

33 阅读2分钟

trait的定义

Scala的trait就类比Java中的接口。

作用:类似于抽象类,定义抽象属性,方法 让其他的子类去实现,可实现多继承

实现单个特质案例

object class21 {
  trait A {
    var name:String;
  }

  class Class1 extends A {
    var name:String = "Class1"
  }

  def main(args: Array[String]): Unit = {
    val class1 = new Class1()
    println(class1.name)
  }
}

实现多个特质案例

object class21 {
  trait A {
    var name:String;
    def sayA(): Unit = {
      println("sayA")
    }
  }

  trait B {
    var age:Int
  }

  class Class1 extends A with B{
    var name:String = "Class1"
    var age:Int = 4
  }
  
  def main(args: Array[String]): Unit = {
    val class1 = new Class1()
    class1.sayA()
    println(class1.name)
    println(class1.age)
  }
}

多继承时,构造器调用顺序

先父后子 先调用父类构造器,再调用子类构造器

有多个父类,从左到右的顺序去调用构造器

案例1

object class22 {

  trait A {
    println("trait A")
  }

  trait B {
    println("trait B")
  }

  trait C {
    println("trait C")
  }
  class Class1 extends B with A with C{
    println("class 1 ...")
  }

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

案例2

object class22 {

  trait A {
    println("trait A")
  }

  trait BB {
    println("trait BB")
  }

  trait B extends BB{
    println("trait B")
  }

  trait CC {
    println("trait CC")
  }

  trait C extends CC{
    println("trait C")
  }
  class Class1 extends B with A with C{
    println("class 1 ...")
  }

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

屏幕截图 2025-11-19 150004.png

空指针异常

目标:实现日志类,可以把一些文本信息写入指定的文件中

package level02

import java.io.FileWriter

object class24 {
  trait Log {
  
    // 文件名,抽象属性
    var fileName:String
    
    println(s"${fileName}")
    // 具体属性
    // lazy 懒加载,懒
    lazy val fileWriter:FileWriter = new FileWriter(fileName)

    def writerLog(msg:String):Unit = {
      fileWriter.write(msg)
      fileWriter.close()
    }
  }
  
// 先执行父类构造器,所以报错
  class TextLog extends Log {
    override var fileName: String = "text01.log"
  }

  def main(args: Array[String]): Unit = {
    val textlog = new TextLog()
    textlog.writerLog("2025-11-19:下午,天气晴朗")
  }
}

trait 和抽象类class

1.相同点:

可以被继承 extends

属性和方法:抽象属性,具体属性,抽象方法,具体方法

都不能被实例化,不能new

2. 不同点:

trait 支持多继承 抽象类class不能多继承