特质的用法
trait:实现多继承
1.具体属性,抽象方法
2.具体方法,抽象属性
trait中可以有抽象,也可以有具体
他的子类必须实现抽象的(属性方法)
object day5 {
trait BeautifulEye {
val eye :String = "大眼睛"// 具体属性
val name:String // 抽象属性
}
trait Tall {
val height:String = "大高个"
def run():Unit ={
println("run......")
}
def jump():Unit
}
// 继承 with
class Child extends BeautifulEye with Tall{
val name:String = "小花"
def jump():Unit = {}
println(s"${name},jump......")
}
def main(args: Array[String]): Unit = {
val child = new Child
println(child.eye)
println(child.height)
}
}
构造器的执行顺序
1.先制造父构造器;再制造子构造器 2.如果是多继承,有多个trait,按书写顺序从左到右执行
object day51 {
trait AA {
println("A特质构造器")
}
trait A extends AA {
println("A 构造器")
}
trait B {
println("B特质构造器")
}
trait CC {
println("CC 特质构造器")
}
trait C extends CC{
println("C 构造器")
}
class Child() extends C with B with A{} // child 会继承A 跟 B
def main(args: Array[String]): Unit = {
val child = new Child ()
println(child)
}
}
trait 和 class 的区别:
- class(类):有伴生类、抽象类、内部类,不能多继承
- trait(特质):可以多继承,更注重行为的组合
共同点:
- 都可以拥有具体属性、抽象属性、具体方法、抽象方法
- 都使用 extends 关键字进行继承(trait 多继承时后续使用 with)
object day52 {
trait FileLogger {
println("fileLogger")
val filename:String
lazy val writer = new FileWriter(filename) // 延迟初始化 writer,直到 filename 被赋值后才创建
def writeLog(msg:String):Unit ={
writer.write(msg)
writer.close()
}
}
class MyWriter extends FileLogger{
println("MyWriter")
override val filename: String = "test1.log"
}
def main(args: Array[String]): Unit = {
val log = new MyWriter()
log.writeLog("测试内容")
}
}