多继承详解

35 阅读1分钟

一.多层trait的加载顺序

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

二.trait与抽象类的区别

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

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

package level02
/**
 * 特质:trait
 * 实现多继承,注意观察父类构造器的执行顺序
 * 1.先父子后子
 * 2.有多个父类,按书写顺序从左到右执行!
 */
object class21 {
  trait A {
    println("A")
  }
  trait BB {
    println("BB")
  }
  trait B extends  BB {
    println("B")
  }
  trait CC {
    println("CC")
  }
  trait C extends CC {
    println("C")
  }
 class Class1 extends C with A with B {
   println("Class1 ")
 }
  def main(args: Array[String]): Unit = {
    new Class1()
  }
}

image.png

package level02
import java.io.FileWriter
/*
演示一个程序错误
 */
object class22 {
//在文件中写入日志
  trait FileLogger{
  println(2)
    //抽象属性:文件名
  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课程")
  }
}

image.png