9.3.8 特质的构造顺序

特质也是有构造器的,构造器中的内容由"字段的初始化"和一些其他语句构成.(类似于类的主构造器)

第1种特质构造顺序(声明类的同时混入特质)

  1. 首先调用超类的构造器

  2. 第一个特质的父特质构造器

  3. 第一个特质的构造器

  4. 第二个特质构造器的父特质构造器, 如果已经执行过,就不再执行

  5. 第二个特质的构造器

    ....

  6. 当前类的构造器

package com.atguigu.day07

object TDemo {
  def main(args: Array[String]): Unit = {
    val son = new Son
    println(son.a1)
  }
}

trait tr{
  val a1 = "最上面的特质的 a1"
  println("最上面特质的构造器")
}

trait tr1 extends tr{
  override val a1 = "第一个特质的 a1"
  println("第一个特质的构造器")
}

trait tr2 extends tr{
  override val a1 = "第二个特质的 a1"
  println("第二个特质的构造器")
}

class Father{
  val a1 = "父类的 a1"
  println("父类的构造器")
}
class Son extends Father with tr1 with tr2{
  override val a1 = "子类的 a1"
  println("子类的构造器")
}


第2种特质构造顺序(在构建对象时,动态混入特质)

  1. 当前类的超类构造器

  2. 当前类的构造器

  3. 第一个特质的父特质构造器

  4. 第一个特质的构造器

  5. 第二个特质构造器的父特质构造器, 如果已经执行过,就不再执行

  6. 第二个特质的构造器

    ....

package com.atguigu.day08

object TDemo2 {
  def main(args: Array[String]): Unit = {
    //动态混入特质
    val son = new Son with tr1 with tr2
  }
}

trait tr {
  println("最上面特质的构造器")
}

trait tr1 extends tr {
  println("第一个特质的构造器")
}

trait tr2 extends tr {
  println("第二个特质的构造器")
}

class Father {
  println("父类的构造器")
}

class Son extends Father {
  println("子类的构造器")
}

Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-04-12 14:49:43

results matching ""

    No results matching ""