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

相关推荐
小冻梨1 天前
模式匹配-基础使用
scala
顧棟4 天前
JAVA、SCALA 与尾递归
java·开发语言·scala
深兰科技4 天前
坦桑尼亚与新加坡代表团到访深兰科技,促进AI在多领域的应用落地
java·人工智能·typescript·scala·perl·ai大模型·深兰科技
a程序小傲5 天前
scala中的Array
开发语言·后端·scala
kk哥88995 天前
scala 介绍
开发语言·后端·scala
17316 天前
scala中的Array
scala
满山狗尾草7 天前
map的常规操作
scala
渣渣盟8 天前
Flink实时数据写入Redis实战
大数据·scala·apache
pale_moonlight8 天前
十、Scala应用实践(下)
linux·开发语言·scala
云岫1159 天前
高贵的hasNext带着“迭代器”袭击你的大脑
scala