一,多个trait的加载顺序
如果有多个父类,则按照从左到右的顺序调用
例如:
/*
*
* 特质
* trait: 实现多继承
* trait多继承构造器的执行顺序
* 1, 先父 后子
* 2, 如果是多继承,有多个trait,按书写顺序从左到右
*/
object day73 {
trait A {
println("A 特质构造器")
}
trait B {
println("B 特质构造器")
}
trait C {
println("C 特质构造器")
}
// 继承 with
class Child() extends C with B with A{
println("child.....")
}// 继承三个特质 A B C
def main(args: Array[String]): Unit = {
val child = new Child()
}
}
运行结果:
C 特质构造器
B 特质构造器
A 特质构造器
child.....
二,多层trait加载顺序
先执行父类中的构造器,再执行子类的构造器:如果trait1也有自己的父类,要先执行父类构造器
/*
*
* 特质
* trait: 实现多继承
* trait多继承构造器的执行顺序
* 1, 先父 后子
* 2, 如果是多继承,有多个trait,按书写顺序从左到右
*/
object day74 {
trait AA {
println("AA 特质构造器")
}
trait A extends AA{
println("A 构造器")
}
trait B {
println("B 特质构造器")
}
trait CC {
println("CC 特质构造器")
}
trait C extends CC{
println("C 特质构造器")
}
// 继承 with
class Child() extends C with B with A{
println("child.....")
}// 继承三个特质 A B C
def main(args: Array[String]): Unit = {
val child = new Child()
}
}
顺序思路
运行结果 :
1.找出这个代码的错误并且修改:
修改如下:
import java.io.FileWriter
/*
*
*/
object day75 {
trait FileLogger {
println("fileLogger")
val filename:String
// 懒加载效果
// 这个对象不会立刻去创建,而是等到你需要的时候才去创建
lazy val writer = new FileWriter(filename)
def writelog(msg:String) = {
writer.write(msg)
writer.close()
}
}
class MyWriter extends FileLogger {
override val filename: String = "test.log"
}// 继承三个特质 A B C
def main(args: Array[String]): Unit = {
val log = new MyWriter()
log.writelog("测试内容")
}
}