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!")
  }
}
相关推荐
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【69】Token 用量统计
java·人工智能·spring
JAVA9652 小时前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试
在繁华处2 小时前
Java从零到熟练(四):面向对象基础
java·开发语言
Unbelievabletobe2 小时前
解决了股票api接口盘后数据更新慢的问题
大数据·开发语言·python
不会C语言的男孩3 小时前
C++ Primer 第2章:变量和基本类型
开发语言·c++
小江的记录本3 小时前
【JVM虚拟机】堆内存分代模型:年轻代(Eden+Survivor)、老年代、元空间Metaspace(附《思维导图》+《面试高频考点清单》)
java·前端·jvm·后端·python·spring·面试
在繁华处4 小时前
Java从零到熟练(三):流程控制
java·开发语言·python
唐青枫4 小时前
Java Optional 实战指南:优雅处理空值与链式转换
java
一起学开源4 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
云泽8085 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法