scala特质
package com.ming.test /** * scala 特质,类似与java接口,但是比java接口强大,可以有实现方法,定义字段之类的 */ /** * 定义一个日志的特质 */ trait LoggerTrait { def logger(str:String):String def loggerDev(str:String):String={"hello"} } /** * 定义一个是否相等的特质 */ trait EqualTrait { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean = !isEqual(x) } /** * 定义一个类,继承上面两个特质 */ class LoggerClass(xc: Int, yc: Int) extends LoggerTrait with EqualTrait{ var x: Int = xc var y: Int = yc def isEqual(obj: Any) = obj.isInstanceOf[LoggerClass] && obj.asInstanceOf[LoggerClass].x == x def logger(str:String):String={str} } /** * 定义一个空类,打算在使用的时候去实现特质 */ class KongClass{ } object TraitTest{ def main(args: Array[String]): Unit = { var a=new LoggerClass(5,6); var b=new LoggerClass(5,6); var c=new LoggerClass(5,7); println(a.isEqual(b)); println(a.isEqual(c)); println(a.isNotEqual(c)); println(a.loggerDev("")); //空类使用继承不同的特质,类似与java实现接口哦 var kong1=new KongClass with LoggerTrait{ def logger(str:String):String={str} } val str=kong1.logger("kong1") println(str) } }
特质构造顺序
特质也可以有构造器,由字段的初始化和其他特征体中的语句构成。这些语句在任何混入该特质的对象在构造是都会被执行。
构造器的执行顺序:
调用超类的构造器;
特质构造器在超类构造器之后、类构造器之前执行;
特质由左到右被构造;
每个特质当中,父特质先被构造;
如果多个特质共有一个父特质,父特质不会被重复构造
所有特质被构造完毕,子类被构造。