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