1,scala提供的「特徵」能夠同時擁有抽象方法和具體方法,一個類能夠擁有多個特質ide
2,類能夠經過「extends」關鍵字繼承trait,繼承trait後必須實現trait中的全部抽象方法,而不是用 override 關鍵字this
3,scala的類只能單繼承,單能夠繼承多個trait,trait之間使用 with 關鍵字鏈接spa
1 package scalaTest 2 3 object TraitApp{ 4 // 建立trait 5 trait trait1{ 6 // 沒有具體實現的方法 7 def sayTrait(name : String) 8 // 有具體實現的方法 9 def sayHello = println("nice to meet you") 10 } 11 12 trait tarit2{ 13 def sysTrait2(age : Int) 14 } 15 16 trait trait3{ 17 def sysTrait3(num : Int) 18 } 19 20 class Person(private var name : String) extends trait1 with tarit2{ 21 def getName = name 22 def sayTrait(name : String) = println("Hello " + name) 23 def sysTrait2(age : Int) = println(name + " is " + age) 24 } 25 26 def main(args: Array[String]): Unit = { 27 val p = new Person("trait") 28 p.sayTrait(p.getName) 29 p.sysTrait2(33) 30 p.sayHello 31 32 // 可在建立對象時用with 33 val p1 = new Person("TRAIT") with trait3{ 34 def sysTrait3(num : Int) = println(num) 35 } 36 p1.sysTrait3(33) 37 } 38 }
4,trait中可定義抽象字段(沒有初始化的字段)和具體的字段(已經初始化了的字段), 類繼承了trait後,必須實現抽象字段,即初始抽象字段,類中能夠直接使用trait中字段。而類繼承了類,需使用 super 關鍵字使用父類中的字段。scala
5,繼承多個trait的時候,整體構造原則是「從左到右,從父到子構造;從右到左,從子到父調用」。code
6,自身類型(selftype)對象
有不少特質不是全部類都能隨隨便便繼承的,例如異常類所能繼承的特質,其餘類繼承並不合適,因此須要對特質加以約束。blog
經過「this : T => {}」的形式,指定這個特質只能被T或T的子類繼承繼承
也能夠經過「this : {} => {}」的形式,指定這個特質能被繼承的規則,「this : {}」中的「{}」就能夠設置規則,好比必須擁有指定對象、方法的類才能繼承這個特質。get
須要注意的是,只能定義一次自身類型,不能定義多個thisit