trait
- trait的變量並不能直接訪問,說明不是靜態的.
- trait既能被class繼承也能被object繼承
- 每一個繼承trait的類生成實例的時候(無論是class還是object)都換先生成一個trait實例(或者說對象)
- java的屬性是static final的,全局唯一。而trait的屬性實際上是方法調用而已。
class Son()
trait Father {
println("i am trait")
val son = new Son()
var b = new Son()
}
class Child1 extends Father
class Child2 extends Father
object Child3 extends Father
object Child4 extends Father
對於上面的代碼,如果Child1和Child2的實例的son(不能是case class,因爲case 自己實現了hashCode)屬性相等.那說明他們指向同一個Father實例,反之則不是。下面的代碼輸出都是false,說明無論object還是class在生成對象的時候,father trait都是單獨生成了一個實例。
object Context {
def main(args: Array[String]): Unit = {
// println(Father.a) // error trait的變量並不能直接訪問,說明不是靜態的。
val child1 = new Child1
val child2 = new Child2
println(child1.son == child2.son) // false
println(Child3.son == Child4.son)// false
}
}
抽象類
在scala中接口和抽象類在內存中沒什麼區別。
- 抽象類的變量並不能直接訪問,說明不是靜態的.
- 抽象類既能被class繼承也能被object繼承
- 每一個繼承抽象類的類生成實例的時候(無論是class還是object)都換先生成一個抽象類實例(或者說對象)
- 唯一的區別:trait多繼承,抽象類是單繼承
object
- object是全局唯一的,換句話說是單例的
- object的方法和屬性都是靜態的
- object不可被繼承,反編譯的結果是final類