trait-多继承详解

34 阅读1分钟

(一)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()
  }
}

输出结果:

image.png

(三)空指针异常

方法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)
  }

}