Scala 特质(Traits)与类继承 #scala #Scala #Scala继承

1.Scala 特质(Traits)与类继承

在Scala中,特质(Traits)是一种可以被混入(mixin)到类中的代码片段,类似于Java中的接口,但更加灵活。特质可以包含字段声明、方法声明和方法实现。特质可以被多个类混入,实现代码的复用。

Scala 复制代码
// 定义特质A051,包含打印语句
trait A051 {
  println("A051")
}

// 定义特质AA051,它继承自A051
trait AA051 extends A051 {
  println("AA051") // 打印AA051
}

// 定义特质AB051,它也继承自A051
trait AB051 extends A051 {
  println("AB051") // 打印AB051
}

// 定义特质B051,包含打印语句
trait B051 {
  println("B051")
}

// 定义特质BA051,它继承自B051
trait BA051 extends B051 {
  println("BA051") // 打印BA051
}

// 定义特质BB051,它也继承自B051
trait BB051 extends B051 {
  println("BB051") // 打印BB051
}

2. Scala 类与特质混入

Scala中的类可以混入多个特质,这允许类继承多个特性。当一个类混入多个特质时,如果这些特质中有相同的方法,那么类必须覆盖这些方法以解决冲突。

Scala 复制代码
// 定义类AB,它混入了四个特质:AA051、BA051、AB051和BB051
class AB extends AA051 with BA051 with AB051 with BB051 {
  println("AB") // 打印AB
}

3.Scala 对象与主程序入口

在Scala中,对象(Object)是一种单例类,它不能被继承。对象通常用作程序的入口点。

Scala 复制代码
// 定义对象Test21_01,包含主程序入口main方法
object Test21_01 {
  // main方法,程序的入口点
  def main(args: Array[String]): Unit = {
    new AB() // 创建AB类的实例,触发特质和类的打印语句
  }
}

这段代码展示了Scala中特质的继承和混入,以及如何使用对象作为程序的入口点。当你运行Test21_01对象的main方法时,会创建AB类的实例,这将触发所有混入特质和类中的打印语句,按照它们在类定义中的顺序执行。

4.空指针异常

Scala 复制代码
import java.io.PrintWriter
// 演示一个经典的错误:空指针异常


trait FilerLogger{
  // 抽象属性,没有 =
  val filename :String
  println("父类",filename)

  // lazy 表示,不立刻求值,而是等到这个变量被使用的时候,去求值
  lazy val fileout = new PrintWriter(filename)

  // 用来 把msg 写入到对应的文件中
  def log (msg:String):Unit={
    fileout.println(msg)
    fileout.flush()
  }
}
class Test211 extends  FilerLogger{
  val filename = "2024-10-28.txt"
  println("子类",filename)
}



object Test21_02 {
  def main(args: Array[String]): Unit = {
    val t1 =new Test211()
    t1.log("test!")
  }
}
相关推荐
Fireworkitte5 小时前
Apache POI 详解 - Java 操作 Excel/Word/PPT
java·apache·excel
weixin-a153003083165 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
DCTANT5 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.5 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
黄雪超5 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice5 小时前
对象的finalization机制Test
java·开发语言·jvm
思则变6 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
lijingguang6 小时前
在C#中根据URL下载文件并保存到本地,可以使用以下方法(推荐使用现代异步方式)
开发语言·c#
¥-oriented6 小时前
【C#中路径相关的概念】
开发语言·c#
CoderCodingNo6 小时前
【GESP】C++四级考试大纲知识点梳理, (7) 排序算法基本概念
开发语言·c++·排序算法