package com.swust.learn
object Traitshunxu extends App{
trait Logger{
println("Logger")
}
trait FileLogger extends Logger{
println("FileLogger")
}
trait Closable{
println("Closeable")
}
class Person{
println("Constructing...")
}
class Student extends Person with FileLogger with Closable{
println("Constructing...")
}
new Student
}
//结果分析
程序首先执行的是直接父类Person的构造函数,由于混入的第一个trait FileLogger扩展自Logger
因此他会先调用Logger的构造函数 然后在调用 FileLogger的构造函数 完成后在调用Closable的构
造函数 最后才会执行Student类自身的构造函数,从而完成对象的创建
//在scala中实际的构造函数是按照以下的顺序进行执行的
如果有超类 则先调用超类的函数
如果混入的trait有父trait 他会按照继承的层次先调用父trait的构造函数
如果有多个父trait 则按照从左到右的顺序执行
当所有的父类构造函数和父trait被构造完成之后 才会构造本类的构造函数