Scala-特质trait
scala里的特质与java里的接口有点像。scala的特质用trait关键字表明。
trait与java的接口的不同点
特质 | java的接口 |
---|---|
可以有var/val修饰的属性 | java里只能定义一些final static修饰的静态变量 |
可以有可执行的代码块 | java里不能有 |
方法可以有方法的执行体 | java没有 |
可以继承特质和类 | 只可以继承接口 |
创建一个trait实例
package traitStudy{
trait T1{
//执行体
println("ss")
//定义可变变量
var name="剑魔"
val id = "暗裔剑魔"
//抽象方法
def attack
//有方法体的方法
def word: Unit ={
println("哈哈哈。。。")
}
}
}
trait的继承实现
一个类继承一个特质要用到A extends B,B是特质。
一个类继承多个特质就要用到 A extends B with C with D,B/C/D都为特质。
一个栗子
class People extends life with animal{
}
代码的执行顺序
继承的多个特质,特质的执行顺序为extends后的从左往右。如果特质有父类,会先执行父类。
class People extends A with B with C{
}
这里也就是ABC的顺序
在继承类里的方法也是有顺序的,它与执行顺序相反,先是自己的后是extends后的从右往左的。
动态混入
package t{
trait T{
def f(): Unit ={
println("f")
}
}
class A{
println("c")
}
object Demo extends App{
//动态混入特质
val a =new A with T
a.f()
}
}
supper
supper是指上一级特质
如果需要指向父类特质,需要用supper[T].f()