scala trait,class 和 object在內存中的狀態

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類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章