Scala入門之包與繼承

1.包

    Scala中的包與java有着諸多的相似之處,但Scala語言中的包更加靈活,實際開發的時候還是儘量使用java包的定義方式並將代碼集中進行管理,
這樣別人讀代碼的時候更方便,代碼更簡潔。包的使用有以下幾點:
    1.外層包無法直接訪問內層包,如果一定要使用的話,可以引入包,
    內層包可以訪問外層包中定義的類或對象,無需引入
    2.scala允許在任何地方進行包的引入,_的意思是引入該包下的所有類和對象
    3.包限制,如private[X]、protected[X]表示將訪問控制限定到X,X外的無法訪問、使用,
    這樣可以起到隔離的作用,比如框架與程序隔離,如果想使用限制內的類、方法等,

像什麼包對象,包裏類改名啊等的就不說了,感覺不常用。

2.繼承

繼承方面能說的也不多,學過java不說也理解 -_-! 能說的也不多。想到再補充吧

3.蘑菇雲代碼

package com.dt.scala.moguyun

/**
  * DT_Spark
  * 類繼承時屬性覆蓋的問題
  * Sporter修改了Person中的字段counter,而counterArray用到counter來定義Array
  * 這時的counter是多少?提前定義
  */
object OverrideField {
  def main(args: Array[String]): Unit = {
    val s = new Sporter
    /*
    new Sporter實例化時,先構造Person類,這時開始counter = 3,但是Sporter重寫了counter,
    而Person沒有實例化,那麼counter就是默認值爲0,然後實例化new Array[Int](counter)長度就爲0,
    接着實例化Sporter,這時counter = 5,不過已經晚了。要驗證也簡單,把override val counter = 5
    註釋掉,看結果
     */
    println(s.counterArray.length)//結果爲0
  }

}

class Person {
  val counter = 3
  println("Person: counter = " + counter)
  val counterArray = new Array[Int](counter)
}

class Sporter extends Person {
//  override val counter = 5
  println("Sporter: counter = " + counter)
}

class Programmer(val name: String, val salary: Double) {
  final override def equals(other: Any) = {
    val that = other.asInstanceOf[Programmer]
    if (that == null) false
    else name == that.name && salary == that.salary
  }

  override def hashCode(): Int = name.hashCode() * 17 + salary.hashCode() * 9


}
結果
把override val counter = 5 註釋前
    Person: counter = 0
    Sporter: counter = 5
    0
                          註釋後
    Person: counter = 3
    Sporter: counter = 3
    3

要解決這問題的辦法就是提前定義,不過樣子不好看,完整代碼如下:

package com.dt.scala.moguyun

/**
  * DT_Spark
  * 類繼承時屬性覆蓋的問題
  * Sporter修改了Person中的字段counter,而counterArray用到counter來定義Array
  * 這時的counter是多少?提前定義
  */
object OverrideField {
  def main(args: Array[String]): Unit = {
    val s = new Sporter
    /*
    new Sporter實例化時,先構造Person類,這時開始counter = 3,但是Sporter重寫了counter,
    而Person沒有實例化,那麼counter就是默認值爲0,然後實例化new Array[Int](counter)長度就爲0,
    接着實例化Sporter,這時counter = 5,不過已經晚了。要驗證也簡單,把override val counter = 5
    註釋掉,看結果
     */
    println(s.counterArray.length)//結果爲0
  }

}

class Person {
  val counter = 3
  println("Person: counter = " + counter)
  val counterArray = new Array[Int](counter)
}
/*
class Sporter extends Person {
  override val counter = 5
  println("Sporter: counter = " + counter)
}
*/

class Sporter extends {
  override val counter = 5
} with  Person

class Programmer(val name: String, val salary: Double) {
  final override def equals(other: Any) = {
    val that = other.asInstanceOf[Programmer]
    if (that == null) false
    else name == that.name && salary == that.salary
  }

  override def hashCode(): Int = name.hashCode() * 17 + salary.hashCode() * 9


}

以上內容來自[DT大數據夢工廠]首席專家Spark專家王家林老師的課程分享。感謝王老師的分享,更多精彩內容請掃描關注[DT大數據夢工廠]微信公衆號DT_Spark

發佈了45 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章