//定义一个特质 //特质可以有抽象属性,具体属性,抽象方法,具体方法 trait Beauty { //抽象属性(没有=) val hair: String //具体属性(有等号) var age = 18 val height = 180 //val不可以修改,var可以修改 //抽象方法(没有=) def smile //具体方法 def say(): Unit = { } } class Boy extends Beauty { //抽象属性 要具体实现 val hair = "短发" //具体属性可以重写(可选) //var 修饰的,可以直接赋值 //val修饰的,可以用override重写 override val height = 189 age = 20 //抽象方法 要具体实现 def smile(): Unit = { println(s"嘴角微微上扬") } //具体方法可以重写(可选) override def say(): Unit = { println(s"${age}岁,${height}大高个,${hair}") }
package Scala3 import java.io.PrintWriter //定义一个特质 trait FileLogger{ println(s"FileLogger ${filename}") //抽象属性 val filename:String //定义一个对象,用来操作文件 //new子类,先会执行父类的构造器,而此时filename没有值。所以导致PrintWriter(filename)报错。 //val fileout=new PrintWriter(filename) val fileout=new PrintWriter(filename) // lazy val fileout=new PrintWriter(filename) //具体方法:把msg这个内容,写入到具体的文件中 def log(msg:String):Unit={ fileout.println(msg) fileout.flush() } } class Person051 extends FileLogger{ override val filename="p051.log" } //NullPointerException:空指针异常 object gfddg { def main(args: Array[String]): Unit = { // val p=new Person051() val p=new{override val filename="p052.log"} with Person051 //p.log中的log方法是谁定义的?是FileLogger定义的 p.log("person051 create log") } }