1.?抽象屬性和方法:用?abstract?關鍵字定義抽象類,其中抽象屬性無初始值,抽象方法無實現 。重寫抽象方法需用?override?,重寫抽象屬性時,可變屬性用?var?,不可變屬性用?val??。
匿名子類:和 Java 一樣,可以通過包含帶有定義或重寫的代碼塊的方式創建一個匿名的子類。
?
2.?單例對象:用?object?聲明,可包含屬性和方法,能直接調用,伴生對象與伴生類同名,可訪問類私有成員。
?
3.?apply方法:可實現不使用?new?創建對象,添加?private?可讓主構造器私有。
-
- 通過伴生對象的 apply 方法,實現不使用 new?方法創建對象。
- 如果想讓主構造器變成私有的,可以在()之前加上 private。
- apply 方法可以重載。
- Scala?中 obj(arg)的語句實際是在調用該對象的 apply?方法,即 obj.apply(arg)。用以統一面向對象編程和函數式編程的風格。
- 當使用 new?關鍵字構建對象時,調用的其實是類的構造方法,當直接使用類名構建對象時,調用的其實時伴生對象的 apply?方法。
4.?特質(trait):類似Java接口,可混合混入類中,解決類單繼承局限 。特質聲明用?trait?,使用時類通過?extends?和?with?關鍵字混入特質。
- ?基本語法:
沒有父類:class?類名?extends?特質?1?with?特質?2?with?特質?3 …
有父類:class?類名?extends?父類?with?特質?1?with?特質?2?with ?特質?3…?
?
-
- 特質可以同時擁有抽象方法和具體方法
- 一個類可以混入(mixin)多個特質
- 所有的 Java?接口都可以當做Scala 特質使用
- 動態混入:可靈活的擴展類的功能
?
由于一個類可以混入(mixin)多個 trait,且 trait 中可以有具體的屬性和方法,若混入的特質中具有相同的方法(方法名,參數列表,返回值均相同),必然會出現繼承沖突問題。沖突分為以下兩種:
?
第一種,一個類(Sub)混入的兩個 trait(TraitA,TraitB)中具有相同的具體方法,且兩個 trait 之間沒有任何關系,解決這類沖突問題,直接在類(Sub)中重寫沖突方法。
第二種,一個類(Sub)混入的兩個 trait(TraitA,TraitB)中具有相同的具體方法,且兩個 trait 繼承自相同的 trait(TraitC),及所謂的“鉆石問題”,解決這類沖突問題,Scala 采用了特質疊加的策略
特質自身類型:自身類型可實現依賴注入的功能
?
5.?類型檢查和轉換:?isInstanceOf?判斷對象是否為某類型,?asInstanceOf?進行類型轉換 。
枚舉類和應用類
枚舉類:需要繼承 Enumeration
應用類:需要繼承App
type 定義新類型
使用 type 關鍵字可以定義新的數據數據類型名稱,本質上就是類型的一個別名
?
6.?集合:介紹Scala集合體系,包括可變與不可變集合,以及?Map?、?List?等常用集合操作 。
-
- Scala?的集合有三大類:序列 Seq、集Set、映射 Map,所有的集合都擴展自 Iterable
特質。
-
- 對于幾乎所有的集合類,Scala?都同時提供了可變和不可變的版本,分別位于以下兩個包
不可變集合:scala.collection.immutable 可變集合:?scala.collection.mutable
-
- Scala?不可變集合,就是指該集合對象不可修改,每次修改就會返回一個新對象, 而不會對原對象進行修改。類似于 java?中的 String?對象
- 可變集合,就是這個集合可以直接對原對象進行修改,而不會返回新的對象。類似于 java?中 StringBuilder?對象
不可變集合繼承圖
可變集合繼承圖
?