trait类似于Java语言中得接口。在trait中,可以包含抽象得和非抽象得方法。所以你可以创建一个包含全部抽象函数或者一部分抽象,一部分非抽象方法得trait。继承trait得类都必须实现trait里面得方法。
在trait中创建得属性可以是 val 修饰得,也可以是var 修饰得。但是如果在trait内部创建得属性,无论是val得还是var得,如果都没有初始值,那么这些属性就都被看做是抽象得。
trait Printable { def print()}class A4 extends Printable { override def print(): Unit = { println("Hello") }}object _22_Trait { def main(args: Array[String]): Unit = { var a = new A4() a.print() }}
Hello
在这个例子中,普通类 A4 继承了trait Printable,那么就必须实现trait里面得方法 print。
如果某个类继承了trait,但是没有实现trait里面得方法,那么这个类就必须是抽象类。
trait Printable { def print()}abstract class A4 extends Printable { def printA4(): Unit = { println("Hello, this is A4 sheet") }}class AA4 extends A4 { override def print(): Unit = { println("Printable method print") } override def printA4() { println("method printA4") }}object _22_Trait { def main(args: Array[String]): Unit = { var a = new AA4() a.print() a.printA4() }}
Printable method printmethod printA4
在上面这个例子中,A4 继承了trait,但是在它里面并没有实现trait得方法print,所以这个 A4 得类型就是一个抽象类。
然后又用一个普通类AA4 实现了抽象类 A4,在AA4里面就要把所有方法都实现了才不会报错。
在一个类中实现多个trait当一个类实现多个trait,用extends关键字连接第壹个trait,然后用with关键字连接后续得trait。同时还要在这个class里面实现所有得trait里面得方法。
trait Printable { def print()}trait Showable { def show()}class A6 extends Printable with Showable { override def print(): Unit = { println("print") } override def show(): Unit = { println("show") }}object _22_Trait { def main(args: Array[String]): Unit = { var a = new A6() a.print() a.show() }}
printshow
trait 含有抽象和非抽象方法
可以在trait里面定义抽象和非抽象得方法。抽象方法没有方法体,一般方法有方法体。
trait和抽象类很相似,唯一得区别在于trait没有构造函数。
你可以继承多个trait,但是不能继承多个抽象方法。
trait Printable { // 抽象方法 def print() // 非抽象方法 def show(): Unit = { println("This is show method") }}class A6 extends Printable { // 只需要实现trait里得抽象方法 override def print(): Unit = { println("This is print method") }}object _22_Trait { def main(args: Array[String]): Unit = { var a = new A6() a.print() a.show() }}
This is print methodThis is show method