1. HelloWorld
// 定義伴生對象
object HelloWorld {
def main(args: Array[String]): Unit = {
println("HelloWorld")
}
}
// 伴生類
class HelloWorld {
}
2. 字段解析
1. object -> 聲明伴生對象
2. def -> 定義函數關鍵字
3. main -> 函數名
4. args -> 函數中參數名字
5. Array[String] -> 函數得參數類型,表示字符串類型得數組
其中中括號“[]”表示泛型
參數名字和參數類型用冒號分開且參數名在前
6. Unit -> 表示返回值爲空,相當於Java中得void關鍵字
在Scala中使用Unit類型沒有void關鍵字,這個類只有一個實例,就是"()"
函數定義和返回值之間用冒號分割
函數定義和函數體之間用等號連接
7. println("HelloWorld") -> 向控制檯打印輸出,不需要加分號
一行中有兩句語句可用分號隔開,不建議使用。
8. class -> 定義類關鍵字
4. 反編譯
- 這裏用的"jd-gui"反編譯java文件工具,下載連接https://jd-gui.apponic.com/
- 如果使用object關鍵字聲明伴生對象的時候,底層會默認幫我們生成伴生類,如果手動定義伴生類的話, 要求伴生類的名字和伴生對象的名字對應起來
伴生類:HelloWorld.class
伴生對象:HelloWorld$.class
5. 解析
- 在伴生類的中通過伴生對象所屬類"."上一個伴生所屬類中的一個靜態成員MODULE$中的main方法
- 在伴生所屬類中定義了一個靜態屬性MODULES$,這個類中還有一個以private 修飾的同類名的私有構造方法,且有一個以static靜態代碼塊包裹的一個new 實例操作,爲餓漢式的單例模式,最後通過這個對象直接點上伴生所屬類中的main方法執行打印操作。Predef. 是Predef$.
6. 總結
- 用Object修飾的類是"伴生對象所屬類"(在大部分資料爲以object聲明的類就是伴生對象,但是按反編譯後理解爲伴生對象所屬類,嚴格講,真正的伴生對象指的是伴生對象所屬類中的單例對象),意思是伴隨着類產生的,這個類指的是同時生成的兩個字節碼文件的HelloWorld.class。
- 對比java中main方法,scala中少了static關鍵字
- Scala是純面向對象的語言,沒有Java的static關鍵字,Scala通過伴生對象模擬實現static的效果
- 在生成的伴生對象所屬類中,定義了一個單例對象,通過該單例對象,模擬java中static關鍵字的實現
- 簡而言之,在Scala中,把所有關於java中靜態static修飾的東西都放在了用object修飾的類中(伴生對象所屬類)
- 以後在Scala編程語言中,類似java中static效果,都在伴生對象中去聲明