trait-多继承详解

40 阅读1分钟

(一)trait 多继承构造器的执行顺序

屏幕截图 2025-11-18 083243.png

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

}

运行结果如下:

屏幕截图 2025-11-18 083329.png

它的输出会是什么?

屏幕截图 2025-11-18 083732.png

代码如下:

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

}

输出结果如下:

屏幕截图 2025-11-18 084028.png

(二)修改错误代码

屏幕截图 2025-11-18 093532.png

错误原因 :16行报错 为初始化顺序问题 改正方式 val 前面加lazy 让这一行不运行

达到这种效果:

屏幕截图 2025-11-18 101028.png

(三)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 = {
  }
}

结果如下:

屏幕截图 2025-11-18 101142.png