trait基本使用

30 阅读2分钟
  1. 先父后子。先调用父类构造器,再调用子类构造器
  2. 有多个父类,从左到右的顺序去调用构造器
package level02
/**
 *多继承时,构造器调用顺序
 *1. 先父后子。先调用父类构造器,再调用子类构造器
 *2. 有多个父类,从左到右的顺序去调用构造器
 **/
object l16 {
  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()
  }

}

package level02

/**
 *多继承时,构造器调用顺序
 *1. 先父后子。先调用父类构造器,再调用子类构造器
 *2. 有多个父类,从左到右的顺序去调用构造器
 **/
object l17 {
  trait A {
    println("trait A")
  }
  trait BB {
    println("trait BB")
  }
  trait B {
    println("trait B")
  }
  trait CC {
    println("trait CC")
  }
  trait C {
    println("trait C")
  }
  class Class1 extends B with BB with A with C  with CC{
    println("class 1...")
  }

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

}

trait和抽象类class的 区别?


package level02

/**
 *trait和抽象类class的 区别?
 *
 * 1.相同点。
 *   可以被继承,extends
 *   属性和方法:抽象属性,具体属性,抽象方法。具体方法
 *   都不能被实例化。不能new
 *
 *2. 不同点。
 *   trait 支持多继承;抽象类不能多继承;
 *
 *
 **/
object l18 {
  trait A {
    println("trait A")
  }
  trait B {
    println("trait A")
  }
  class C extends A with B{

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

}

空指针异常


package level02
import java.io.FileWriter
/**
 *空指针异常
 *
 *目标:实现日志类,可以把一些文本信息写入指定的文件中
 *
 */

object l19 {
  trait Log {
    //抽象属性:文件名
    var fileName:String

    println(s"$fileName")
    //具体属性
    lazy val fileWriter:FileWriter=new FileWriter(fileName)

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


  }
  class TexLog extends Log{

    var fileName:String="text01.log"
  }

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

  }
}