【零】Scala之HelloWorld解析

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. 反編譯

  1. 這裏用的"jd-gui"反編譯java文件工具,下載連接https://jd-gui.apponic.com/
  2. 如果使用object關鍵字聲明伴生對象的時候,底層會默認幫我們生成伴生類,如果手動定義伴生類的話, 要求伴生類的名字和伴生對象的名字對應起來

在這裏插入圖片描述

伴生類:HelloWorld.class

在這裏插入圖片描述

伴生對象:HelloWorld$.class

在這裏插入圖片描述

5. 解析

  1. 在伴生類的中通過伴生對象所屬類"."上一個伴生所屬類中的一個靜態成員MODULE$中的main方法

在這裏插入圖片描述

  1. 在伴生所屬類中定義了一個靜態屬性MODULES$,這個類中還有一個以private 修飾的同類名的私有構造方法,且有一個以static靜態代碼塊包裹的一個new 實例操作,爲餓漢式的單例模式,最後通過這個對象直接點上伴生所屬類中的main方法執行打印操作。Predef. 是Predef$.

在這裏插入圖片描述

6. 總結

  1. 用Object修飾的類是"伴生對象所屬類"(在大部分資料爲以object聲明的類就是伴生對象,但是按反編譯後理解爲伴生對象所屬類,嚴格講,真正的伴生對象指的是伴生對象所屬類中的單例對象),意思是伴隨着類產生的,這個類指的是同時生成的兩個字節碼文件的HelloWorld.class。
  2. 對比java中main方法,scala中少了static關鍵字
  3. Scala是純面向對象的語言,沒有Java的static關鍵字,Scala通過伴生對象模擬實現static的效果
  4. 在生成的伴生對象所屬類中,定義了一個單例對象,通過該單例對象,模擬java中static關鍵字的實現
  5. 簡而言之,在Scala中,把所有關於java中靜態static修飾的東西都放在了用object修飾的類中(伴生對象所屬類)
  6. 以後在Scala編程語言中,類似java中static效果,都在伴生對象中去聲明
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章