trait的定义
Scala的trait就类比Java中的接口。
作用:类似于抽象类,定义抽象属性,方法 让其他的子类去实现,可实现多继承
实现单个特质案例
object class21 {
trait A {
var name:String;
}
class Class1 extends A {
var name:String = "Class1"
}
def main(args: Array[String]): Unit = {
val class1 = new Class1()
println(class1.name)
}
}
实现多个特质案例
object class21 {
trait A {
var name:String;
def sayA(): Unit = {
println("sayA")
}
}
trait B {
var age:Int
}
class Class1 extends A with B{
var name:String = "Class1"
var age:Int = 4
}
def main(args: Array[String]): Unit = {
val class1 = new Class1()
class1.sayA()
println(class1.name)
println(class1.age)
}
}
多继承时,构造器调用顺序
先父后子 先调用父类构造器,再调用子类构造器
有多个父类,从左到右的顺序去调用构造器
案例1
object class22 {
trait A {
println("trait A")
}
trait B {
println("trait B")
}
trait C {
println("trait C")
}
class Class1 extends B with A with C{
println("class 1 ...")
}
def main(args: Array[String]): Unit = {
new Class1()
}
}
案例2
object class22 {
trait A {
println("trait A")
}
trait BB {
println("trait BB")
}
trait B extends BB{
println("trait B")
}
trait CC {
println("trait CC")
}
trait C extends CC{
println("trait C")
}
class Class1 extends B with A with C{
println("class 1 ...")
}
def main(args: Array[String]): Unit = {
new Class1()
}
}
空指针异常
目标:实现日志类,可以把一些文本信息写入指定的文件中
package level02
import java.io.FileWriter
object class24 {
trait Log {
// 文件名,抽象属性
var fileName:String
println(s"${fileName}")
// 具体属性
// lazy 懒加载,懒
lazy val fileWriter:FileWriter = new FileWriter(fileName)
def writerLog(msg:String):Unit = {
fileWriter.write(msg)
fileWriter.close()
}
}
// 先执行父类构造器,所以报错
class TextLog extends Log {
override var fileName: String = "text01.log"
}
def main(args: Array[String]): Unit = {
val textlog = new TextLog()
textlog.writerLog("2025-11-19:下午,天气晴朗")
}
}
trait 和抽象类class
1.相同点:
可以被继承 extends
属性和方法:抽象属性,具体属性,抽象方法,具体方法
都不能被实例化,不能new
2. 不同点:
trait 支持多继承 抽象类class不能多继承