(一)trait的加载顺序
如果有多个父类,则按照从左到右的顺序调用。
package level02
/*
* 特质:trait
* 实现多继承,注意观察父子类的构造器的执行顺序
1.先父后子
2.有多个父类,按书写顺序从左向右执行!
*/
object class22 {
trait A {
println("A")
}
trait B {
println("B")
}
class Class1 extends A with B{
println("Class1")
}
def main(args:Array[String]):Unit = {
new Class1()
}
}
package level02
/*
* 特质:trait
* 实现多继承,注意观察父子类的构造器的执行顺序
1.先父后子
2.有多个父类,按书写顺序从左向右执行!
*/
object class22 {
trait A {
println("A")
}
trait BB {
println("BB")
}
trait B extends BB{
println("B")
}
trait CC {
println("CC")
}
trait C extends CC{
println("C")
}
class Class1 extends C with B with A{
println("Class1")
}
def main(args:Array[String]):Unit = {
new Class1()
}
}
输出结果:
(三)空指针异常
方法1:懒加载
package level02
/*
* 1.类和对象(一个类class,多个对象)
* 2.
* 3.
* 4.辅助构造器
* 多个类之间的关系: 继承
*
* 好处:不劳而获
* 重写:子类对父亲的同名方法进行重写
* 父类和子类的构造器调用顺序:先调用父类的构造器,再调用子类的构造器
*/
object Class14 {
// 父类
class Dog(var name:String ,var age:Int) {
println(s"Dog ${name},${age} 构造器被调用")
}
// 子类 中华田园犬
// 子类带参构造器
// 1. 继承父类的属性。
class RuralDog(name:String,age:Int) extends Dog(name, age){
println("RuralDog 的构造器...")
}
def main(args:Array[String]): Unit = {
new RuralDog("旺财",3)
}
}