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

相关推荐
开开心心就好5 天前
用户推荐的文件解锁与强制操作工具
安全·智能手机·pdf·scala·音视频·symfony·1024程序员节
WL_Aurora6 天前
Scala核心编程(二):变量与数据类型详解
开发语言·scala
WL_Aurora7 天前
Scala核心编程(一):Scala语言概述与快速入门
spark·scala
o丁二黄o8 天前
语义版本控制:用Gemini镜像站实现合同条款的深度差异分析与风险追踪
javascript·kotlin·scala
与仪共舞11 天前
罗德与施瓦茨 NRP18S|三路二极管射频功率传感器
scala·数据库架构
howard200514 天前
1.8.3 掌握Scala类与对象 - Scala基本骨架方法
scala·基本骨架方法
howard200515 天前
1.9 掌握Scala抽象类与特质
scala·抽象类·特质
howard200516 天前
1.8.2 掌握Scala类与对象 - 单例对象与伴生对象
scala·伴生对象·单例对象
howard200518 天前
1.7.1 掌握Scala函数 - 声明Scala函数
scala·声明scala函数·显式声明·隐式声明
howard200520 天前
1.6.4 掌握Scala数据结构 - 元组
scala·元组