26 trait-多继承详解

一. 多个trait的加载顺序

实现多继承,注意观察父子类的构造器的执行顺序

  1. 先父后子
  2. 有多个父类,按书写顺序从左到右执行

例如:

scala 复制代码
trait A {
  println("a")
}

trait B {
  println("b")
}

class Class1 extends A with B {
  println("class1")
}

def main(args: Array[String]): Unit = {
  new Class1()
}

结果如图:

二. 多层trait的加载顺序

先执行父类中的构造器,再执行子类的构造器:如果trait1也有自己的父类,要先执行父类构造器

Scala 复制代码
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 A with B {
  println("Class1")
}

def main(args: Array[String]): Unit = {
  new Class1()
}

结果如图:

三. 空指针异常

错误代码演示

Scala 复制代码
import java.io.FileWriter

object Class24 {

  // 在文件中写入日志
  trait FileLogger {
    // 抽象字段
    val filename: String
    val fileWriter = new FileWriter(filename, true)
    def writeLog(msg: String): Unit = {
      fileWriter.write(msg)
      fileWriter.close()
    }
  }

  class MyFileLogger extends FileLogger {
    val filename = "11-26.log"
  }

  def main(args: Array[String]): Unit = {
    val fileLogger = new MyFileLogger()
    fileLogger.writeLog("今天上午上scala课程")
  }

}

修改代码

Scala 复制代码
lazy val fileWriter = new FileWriter(filename, true)

结果如图:

四. trait与抽象类的区别

相同点: 类和trait都可以定义成员变量(抽象,具体);继承时都使用extends关键字;

不同点: trait的构造器不能带参数;trait支持多继承;

相关推荐
李白的天不白15 天前
确认 Nginx 配置文件是否真的生效
scala
醉颜凉17 天前
Scala自定义Monad实战:从理论到应用的完整指南
大数据·算法·scala
那晚的她17 天前
Scala中Set集合
开发语言·后端·scala
IvanCodes17 天前
二、Scala流程控制:分支与循环
大数据·scala
Veggie2617 天前
【Scala PyTorch深度学习】PyTorch On Scala系列课程 第十四章 29 PyTorch模型扩展自定义Module【AI Infra3】[PyTorch Scala硕士研一课程】
人工智能·深度学习·scala
Clf丶忆笙17 天前
搭建支持多语言开发的Quarkus环境:Java、Kotlin与Scala全栈指南
java·开发语言·云原生·kotlin·scala·quarkus
IvanCodes17 天前
四、Scala深入面向对象:类、对象与伴生关系
开发语言·后端·scala
嗯.~17 天前
scala的泛型应用场景
开发语言·后端·scala
醉颜凉17 天前
Scala Cats Effect纯函数式并发编程:从Fiber模型到生产级应用
大数据·网络·scala
2601_9611940219 天前
考研学校专业课真题
spring boot·考研·eclipse·log4j·scala·symfony