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支持多继承;

相关推荐
hopsky11 天前
《Scala 学习手册》核心内容详解
人工智能·学习·scala
abcy07121321 天前
scala playframework 搭建与新建controller教程
scala
lpfasd12322 天前
编程语言榜单变迁分析
开发语言·后端·scala
戮漠summer1 个月前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
醉熏的石头2 个月前
Ubuntu 中的编程语言(中)
linux·ubuntu·scala
Irene19912 个月前
Scala、Java、Python、JavaScript 的核心特性和应用场景(Python 的“单机“局限性:GIL 机制导致的多核并行缺陷)
java·javascript·python·scala
李白的天不白3 个月前
确认 Nginx 配置文件是否真的生效
scala
醉颜凉3 个月前
Scala自定义Monad实战:从理论到应用的完整指南
大数据·算法·scala
那晚的她3 个月前
Scala中Set集合
开发语言·后端·scala
IvanCodes3 个月前
二、Scala流程控制:分支与循环
大数据·scala