简介
和类一样,特质也可以有构造器,由字段的初始化和其他特质体中的语句构成。
构造顺序
声明类的同时混入特质
代码案例
object MixInSeq {
def main(args: Array[String]): Unit = {
val ff = new FF
println(ff)
}
}
trait AA {
println("A...")
}
trait BB extends AA {
println("B....")
}
trait CC extends BB {
println("C....")
}
trait DD extends BB {
println("D....")
}
class EE {
println("E...")
}
class FF extends EE with CC with DD {
println("F....")
}
输出结果:
E...
A...
B....
C....
D....
F....
执行顺序以及细节
- 首先调用当前类的超类构造器
- 第一个特质的父特质构造器
- 第一个特质构造器
- 第二个特质的父特质构造器(如果是已经执行过的就不需要再次的执行)
- 第二个特质构造器
- …
- 当前类的构造器
在构建对象时,动态混入特质
代码案例
object MixInSeq {
def main(args: Array[String]): Unit = {
val kk = new KK with CC with DD
println(kk)
}
}
trait AA {
println("A...")
}
trait BB extends AA {
println("B....")
}
trait CC extends BB {
println("C....")
}
trait DD extends BB {
println("D....")
}
class EE {
println("E...")
}
class KK extends EE {
println("K....")
}
输出结果:
E...
K....
A...
B....
C....
D....
执行顺序以及细节:
- 调用当前类的超类构造器
- 当前类的构造器
- 第一个特质的父特质构造器
- 第一个特质构造器
- 第二个特质的父特质构造器(如果已执行就不需要再次执行)
- 第二个特质构造器
- …