trait多继承

29 阅读2分钟

多个trait的加载顺序

/*
*特质:trait
* 它用来实现多继承:注意观察父子类的构造器的执行程序
* 1.先父后子
* 2.有多个父类,按书写顺序从左向右执行
*/
object Class10 {
 trait A {
  println("A")
 }
 trait B {
  println("B")
 }

 class Class1 extends A with B{
    println("Class1")
   }


 def main(args: Array[String]): Unit = {
  new Class1()
   }
}

多层trait的加载顺序

先执行父类中的构造器,再执行子类的构造器:如果trait1也有自己的父类,要先执行父类构造器

/*
*特质:trait
* 它用来实现多继承:注意观察父子类的构造器的执行程序
* 1.先父后子
* 2.有多个父类,按书写顺序从左向右执行
*/
object Class10 {
 trait A {
  println("A")
 }
 trait B {
  println("B")
 }
 trait C {
  println("C")
 }

 class Class1 extends C with B with A{
    println("Class1")
   }


 def main(args: Array[String]): Unit = {
  new Class1()
   }
}
/*
*特质:trait
* 它用来实现多继承:注意观察父子类的构造器的执行程序
* 1.先父后子
* 2.有多个父类,按书写顺序从左向右执行
*/
object Class10 {
 trait A {
  println("A")
 }

 trait BB {
   println("BB")
  }
 trait B extends BB{
  println("B")}

// trait C {
//  println("C")
// }

 class Class1 extends B with A {
    println("Class1")
   }


def main(args: Array[String]): Unit = {
  new Class1()
 }
}
/*
*特质:trait
* 它用来实现多继承:注意观察父子类的构造器的执行程序
* 1.先父后子
* 2.有多个父类,按书写顺序从左向右执行
*/
object Class10 {
 trait A {
  println("A")
 }

 trait BB {
   println("BB")
  }
 trait B extends BB{
  println("B")}

 trait CC {
  println("CC")
 }
 trait C extends CC{
  println("C")
 }

 class Class1 extends C with A with B {
    println("Class1")
   }


def main(args: Array[String]): Unit = {
  new Class1()
 }
}

空指针异常

错误演示:

import java.io.FileWriter
object Class11 {
  //在文件中写入日志
 trait FileLogger {
  //抽象属性:文件名
    val filename:String
    val fileWriter=new FileWriter(filename,true)
    def writeLog(msg:String):Unit = {
      fileWriter.write(msg)
      fileWriter.close()
    }
 }
 class MyFileLogger extends FileLogger {
    val filename="11-26.log"
   }


def main(args: Array[String]): Unit = {
  val filelogger = new MyFileLogger()
  filelogger.writeLog("今天上午上Scala课程")
 }
}

修改后:

import java.io.FileWriter
/*
*演示一个程序错误
*/
object Class11 {
  //在文件中写入日志
 trait FileLogger {
  //抽象属性:文件名
    val filename:String
    lazy val fileWriter=new FileWriter(filename,true)
    def writeLog(msg:String):Unit = {
      fileWriter.write(msg)
      //fileWriter.close()
    }
 }
 class MyFileLogger extends FileLogger {
    val filename="11-26.log"
   }


def main(args: Array[String]): Unit = {
  val filelogger = new MyFileLogger()
  filelogger.writeLog("今天上午上Scala课程")
  filelogger.writeLog("下午没有课")
 }
}

lazy:懒惰的

trait与抽象类的区别

相同点:类和trait都可以定义成员变量(抽象,具体);继承时都使用extends关键字;

不同点:trait的构造器不能带参数;trait支持多继承;