scala 中 trait 比起java的接口已经强大了很多。

在混入trait和有父类的同时,构造器的调用顺序如下:

1. 如果有父类,则先调用父类的构造器
2. 如果有父trait,它会按照继承层次先调用父trait的构造器
2. 如果有多个父trait,则按顺序从左到右执行
3. 所有父类构造器和父trait被构造完之后,才会构造本类

因此下面代码示例中,先调用的是父Trait(示例中没有父类),之后调用Person Trait的构造,最后调用的是Teacher的构造。

而最后的匿名类的调用构造的顺序和之前一样,只不过少了类本身的构造(因为是匿名的)。

 



package main.scala.TraitTest1

/**
  * Created by postbird on 2016/9/13.
  */

trait Animal{
    println("I am Animal!")
    def walk():Unit
}
trait Person extends Animal{
    println("I am Person!")
    def speak():Unit
}
class Teacher(name:String,age:Int) extends Person() with Animal{
    println("I am Teacher!")

    override def walk(): Unit ={
        println("walking....")
    }
    override def speak(): Unit ={
        println("speaking....")
    }
}
object TraitTest {
    def main(args: Array[String]) {
        val t=new Teacher("Postbird",18)
        t.speak()
        t.walk()
//        I am Animal!
//        I am Person!
//        I am Teacher!
//        speaking....
//        walking....

        //匿名类
        new Person {override def speak() = {println("person speak.....")}

            override def walk(): Unit ={println("person walking")}
        }.speak()
//        I am Animal!
//        I am Person!
//        person speak.....
    }
}