trait-多继承

29 阅读1分钟

一. 多继承时trait的加载顺序

1.如果有多个父类,则按照从左到右的顺序调用。例如:

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

代码解析如下:

package level02

/*
* 多继承时,构造器调用顺序
* 1.先夫后子,先调用父类构造器,再调用子类构造器
* 2.有多个父类,从左到右的顺序去调用构造器
* */

object class20 {
  trait A {
    println("trait A")
  }

  trait B {
    println("trait B")
  }

  trait C {
    println("trait C")
  }

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

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

}

2.多层trait的加载顺序

先执行父类中的构造器,再执行子类的构造器:如果trait1也有自己的父类,要先执行父类构造器,例如:

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

package level02

/*
* 多继承时,构造器调用顺序
* 1.先夫后子,先调用父类构造器,再调用子类构造器
* 2.有多个父类,从左到右的顺序去调用构造器
* */

object class20 {
  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 A with B with C {
    println("class 1...")
  }

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

}

空指针异常

object class23{
  trait Log {
    //
    var fileName:String

    var fileWriter:FileWriter = new FileWriter(fileName)

    def writerLog(msg: String): Unit = {
      fileWriter.write(msg)
      fileWriter.close()
    }
  }
class TextLog extends Log {

  var fileName:String = "text01.Log"
}

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

修改后:

package level02

import java.io.FileWriter

/*
* 空指针异常
*
*  目标:实现日志类,可以把一些文本信息写入制定的文件中
*
* */

object class23{
  trait Log {
    //文件名
    var fileName:String

    println(s"${fileName}")
    //
    //
    lazy val fileWriter:FileWriter = new FileWriter(fileName)


    def writerLog(msg: String): Unit = {
      fileWriter.write(msg)
      fileWriter.close()
    }
  }

  class TextLog extends Log{

    var fileName: String = "texe02.log"
  }
  def main(args: Array[String]): Unit = {
    val textlog = new TextLog()
    textlog.writerLog("2025-11-19: 温暖的冬天")
  }
}