匿名子類:
說明
和?Java 一樣,可以通過包含帶有定義或重寫的代碼塊的方式創建一個匿名的子類。
單例對象(伴生對象)
Scala語言是完全面向對象的語言,所以并沒有靜態的操作(即在Scala中沒有靜態的概念)。但是為了能夠和Java語言交互(因為Java中有靜態概念),就產生了一種特殊的對象來模擬類對象,該對象為單例對象。若單例對象名與類名一致,則稱該單例對象這個類的伴生對象,這個類的所有“靜態”內容都可以放置在它的伴生對象中聲明。
單例對象語法:
基本語法:
object?Person{
?
val?country:String="China"
?
}
?
說明
(1)?單例對象采用object 關鍵字聲明
(2)?單例對象對應的類稱之為伴生類,伴生對象的名稱應該和伴生類名一致。
(3)?單例對象中的屬性和方法都可以通過伴生對象名(類名)直接調用訪問。
apply 方法:
說明:
(1)?通過伴生對象的 apply 方法,實現不使用 new 方法創建對象。
(2)?如果想讓主構造器變成私有的,可以在()之前加上 private。
(3)?apply 方法可以重載。
(4)?Scala 中 obj(arg)的語句實際是在調用該對象的 apply 方法,即?obj.apply(arg)。用以統一面向對象編程和函數式編程的風格。
(5)?當使用 new 關鍵字構建對象時,調用的其實是類的構造方法,當直接使用類名構建對象時,調用的其實時伴生對象的 apply 方法。
特質(Trait):
Scala 語言中,采用特質 trait(特征)來代替接口的概念,也就是說,多個類具有相同的特質(特征)時,就可以將這個特質(特征)獨立出來,采用關鍵字 trait 聲明。
Scala 中的 trait 中即可以有抽象屬性和方法,也可以有具體的屬性和方法,一個類可以混入(mixin)多個特質。這種感覺類似于 Java 中的抽象類。
Scala 引入 trait 特征,第一可以替代 Java 的接口,第二個也是對單繼承機制的一種補充。
特質基本語法:
一個類具有某種特質(特征),就意味著這個類滿足了這個特質(特征)的所有要素,?所以在使用時,也采用了extends 關鍵字,如果有多個特質或存在父類,那么需要采用with 關鍵字連接。
1)?基本語法:
沒有父類:class?類名 extends?特質 1?with?特質 2?with?特質 3 …
有父類:class?類名?extends?父類?with?特質 1?with?特質 2?with ?特質 3… 2)說明
(1)?類和特質的關系:使用繼承的關系。
(2)?當一個類去繼承特質時,第一個連接詞是 extends,后面是with。
(3)?如果一個類在同時繼承特質和父類時,應當把父類寫在 extends 后。
特質疊加:
由于一個類可以混入(mixin)多個 trait,且 trait 中可以有具體的屬性和方法,若混入的特質中具有相同的方法(方法名,參數列表,返回值均相同),必然會出現繼承沖突問題。沖突分為以下兩種:
第一種,一個類(Sub)混入的兩個 trait(TraitA,TraitB)中具有相同的具體方法,且兩個 trait 之間沒有任何關系,解決這類沖突問題,直接在類(Sub)中重寫沖突方法。
第二種,一個類(Sub)混入的兩個 trait(TraitA,TraitB)中具有相同的具體方法,且兩個 trait 繼承自相同的 trait(TraitC),及所謂的“鉆石問題”,解決這類沖突問題,Scala 采用了特質疊加的策略。
特質和抽象類的區別:
1.?優先使用特質。一個類擴展多個特質是很方便的,但卻只能擴展一個抽象類。
2.?如果你需要構造函數參數,使用抽象類。因為抽象類可以定義帶參數的構造函數,
而特質不行(有無參構造)。
類型檢查和轉換
說明:(1)?obj.isInstanceOf[T]:判斷 obj 是不是T 類型。
(2)?obj.asInstanceOf[T]:將 obj 強轉成 T 類型。
?
(3)?classOf?獲取對象的類名。
集?合:
集合簡介:
1)?Scala 的集合有三大類:序列 Seq、集Set、映射 Map,所有的集合都擴展自?Iterable
特質。
2)?對于幾乎所有的集合類,Scala 都同時提供了可變和不可變的版本,分別位于以下兩個包
不可變集合:scala.collection.immutable?可變集合:?scala.collection.mutable
3)?Scala 不可變集合,就是指該集合對象不可修改,每次修改就會返回一個新對象, 而不會對原對象進行修改。類似于 java 中的 String 對象
4)?可變集合,就是這個集合可以直接對原對象進行修改,而不會返回新的對象。類似于 java 中 StringBuilder 對象
?
?