(一)trait 多继承构造器的执行顺序
package level02
/*
* 特质
* trait: 实现多继承
trait 多继承构造器的执行顺序
* 1 先父 后子
2. 如果是多继承,有多个trait,按书写顺序从左到右
**/
object class17 {
trait A {
println("A 特质构造器")
}
trait B {
println("B 特质构造器")
}
trait C {
println("C 特质构造器")
}
class Child() extends C with B with A {
println("child ......")
} // 继承三个特质 ABC
def main(args: Array[String]): Unit = {
val child=new Child()
}
}
运行结果如下:
它的输出会是什么?
代码如下:
package level02
/*
* 特质
* trait: 实现多继承
trait 多继承构造器的执行顺序
* 1 先父 后子
2. 如果是多继承,有多个trait,按书写顺序从左到右
**/
object class17 {
trait AA {
println("AA 特质构造器")
}
trait A extends AA {
println("A 特质构造器")
}
trait B {
println("B 特质构造器")
}
trait CC {
println("CC 特质构造器")
}
trait C extends CC{
println("C 特质构造器")
}
class Child() extends C with B with A {
println("child ......")
} // 继承三个特质 ABC
def main(args: Array[String]): Unit = {
val child=new Child()
}
}
输出结果如下:
(二)修改错误代码
错误原因 :16行报错 为初始化顺序问题 改正方式 val 前面加lazy 让这一行不运行
达到这种效果:
(三)trait 和 class 的区别
package level02
import java.io.FileWriter
/*
trait 和 class 的区别
1.class类 伴生类 抽象类 内部类 不能多继承
2.trait 特质,可以多继承,构造器不能带参数 extends with
共同点
1.都可以有 :具体属性,抽象属性,具体方法,抽象方法
2.都使用extends 来继承
*/
object class19 {
class A{}
trait B{}
class AB extends A with B{
}
def main(args: Array[String]): Unit = {
}
}
结果如下: