trait的构造机制
如果一个类实现了多个trait,那这些trait是如何构造的呢?
定义
trait也有构造代码,但和类不一样,特质不能有构造器参数
每个特质只有一个无参数的构造器。
一个类继承另一个类、以及多个trait,当创建该类的实例时,它的构造顺序如下:
执行父类的构造器
从左到右依次执行trait的构造器
如果trait有父trait,先构造父trait,如果多个trait有同样的父trait,则只初始化一次
执行子类构造器
示例
示例说明
定义多个特质,然后用一个类去实现它们
测试trait的构造顺序
步骤:
创建一个Logger特质,在构造器中打印"执行Logger构造器!"
创建一个MyLogger特质,继承自Logger特质,,在构造器中打印"执行MyLogger构造器!"
创建一个TimeLogger特质,继承自Logger特质,在构造器中打印"执行TimeLogger构造器!"
创建一个Person类,在构造器中打印"执行Person构造器!"
创建一个Student类,继承自Person、MyLogger、TimeLogge特质,在构造器中打印"执行Student构造器!"
添加main方法,实例化Student_One类,观察输出。
参考代码:
trait Logger {
println("执行Logger构造器")
}
trait MyLogger extends Logger {
println("执行MyLogger构造器")
}
trait TimeLogger extends Logger {
println("执行TimeLogger构造器")
}
class Person{
println("执行Person构造器")
}
class Student extends Person with TimeLogger with MyLogger {
println("执行Student构造器")
}
def main(args: Array[String]): Unit = {
new Student
}
// 程序运行输出如下:
// 执行Person构造器
// 执行Logger构造器
// 执行TimeLogger构造器
// 执行MyLogger构造器
// 执行Student构造器
结果: