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!")
}
}