特质

2 阅读1分钟

特质的用法

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 的区别:

  1. class(类):有伴生类、抽象类、内部类,不能多继承
  2. trait(特质):可以多继承,更注重行为的组合

共同点:

  1. 都可以拥有具体属性、抽象属性、具体方法、抽象方法
  2. 都使用 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("测试内容")
 }
}