trait-多继承详解

34 阅读1分钟

1.多个trait的加载顺序

/*
*
*特质:trait
*实现多继承,注意观察父子类的构造器的执行顺序
* 1.先父后子
* 2.有多个父类,按书写顺序从左向右执行!
*
*
 */


object Class20 {

  trait A {
    println("A")
  }

  trait B {
    println("B")
  }


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


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

        new Class1()
    }
  }

2.空指针异常

import java.io.FileWriter


object Class21 {


  // 在文件中写入日志
    trait FileLogger {
      // 抽象属性:文件名
      val filename: String
      lazy val fileWriter = new FileWriter(filename, true)

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

    class MyFileLogger extends FileLogger {
      println(1)
      val filename = "11-28.log"
    }

    def main(args: Array[String]): Unit = {
      val filelogger = new MyFileLogger()
      filelogger.writeLog("今天上午学Scala课程")
    }
  }
  • 方法1:懒加载

lazy val fileout = new PrintWriter(filename)

  • 方法2:提前定义

val p = new {override val filename="p052.log"} with Person051

3.trait与抽象类的区别

  • 相同点:类和trait都可以定义成员变量(抽象,具体);继承时都使用extends关键字;

  • 不同点:trait的构造器不能带参数;trait支持多继承;