9.3.8 特质的构造顺序
特质也是有构造器的,构造器中的内容由"字段的初始化"和一些其他语句构成.(类似于类的主构造器)
第1种特质构造顺序(声明类的同时混入特质)
首先调用超类的构造器
第一个特质的父特质构造器
第一个特质的构造器
第二个特质构造器的父特质构造器, 如果已经执行过,就不再执行
第二个特质的构造器
....
当前类的构造器
package com.atguigu.day07
object TDemo {
def main(args: Array[String]): Unit = {
val son = new Son
println(son.a1)
}
}
trait tr{
val a1 = "最上面的特质的 a1"
println("最上面特质的构造器")
}
trait tr1 extends tr{
override val a1 = "第一个特质的 a1"
println("第一个特质的构造器")
}
trait tr2 extends tr{
override val a1 = "第二个特质的 a1"
println("第二个特质的构造器")
}
class Father{
val a1 = "父类的 a1"
println("父类的构造器")
}
class Son extends Father with tr1 with tr2{
override val a1 = "子类的 a1"
println("子类的构造器")
}
第2种特质构造顺序(在构建对象时,动态混入特质)
当前类的超类构造器
当前类的构造器
第一个特质的父特质构造器
第一个特质的构造器
第二个特质构造器的父特质构造器, 如果已经执行过,就不再执行
第二个特质的构造器
....
package com.atguigu.day08
object TDemo2 {
def main(args: Array[String]): Unit = {
//动态混入特质
val son = new Son with tr1 with tr2
}
}
trait tr {
println("最上面特质的构造器")
}
trait tr1 extends tr {
println("第一个特质的构造器")
}
trait tr2 extends tr {
println("第二个特质的构造器")
}
class Father {
println("父类的构造器")
}
class Son extends Father {
println("子类的构造器")
}