Scala學習筆記(5)-類和方法

Scala裏的類和方法的概念都是差很少的,這裏只列出Scala重要的一些概念: java

1.Public是Scala的缺省訪問級別,能夠省略不寫。 數組

2.Scala裏方法參數的一個重要特徵是它們都是val,不是var(參數是val的理由是val更容易講清楚,你不須要多看代碼以肯定是否val被從新賦值,而var則否則。)若是你想在方法裏面給參數從新賦值,結果是編譯失敗。 服務器

3.若是方法沒有發現任何顯式的返回語句,Scala將返回方法中最後一個計算獲得的值。 多線程

4.對於方法來講推薦的風格實際是避免顯式的尤爲是多個返回語句。代之以把每一個方法看成是建立返回值的表達式。這種哲學將鼓勵你製造很小的方法,把較大的方法分解爲多個更小的方法。另外一方面,設計選擇取決於設計內容,Scala使得編寫具備多個,顯式的return的方法變得容易,若是那的確是你指望的。 優化

5.帶有大括號但沒有等號的,在本質上看成是顯式定義結果類型爲Unit的方法。 this

def g() { "this String gets lost too" }

當你去掉方法體前面的等號時,它的結果類型將註定是Unit。不論方法體裏面包含什麼都不例外,由於Scala編譯器能夠把任何類型轉換爲Unit。例如,若是方法的最後結果是String,但方法的結果類型被聲明爲Unit,那麼String將被轉變爲Unit並失去它的值。 spa

def f(): Unit = "this String gets lost"

6.Singleton對象 命令行

Scala比Java更面向對象的一個方面是Scala沒有靜態成員。替代品是,Scala有單例對象:singleton object。除了用object關鍵字替換了class關鍵字之外,單例對象的定義看上去就像是類定義。 線程

就如第一章裏的小例子同樣: scala

object Demo {//一個單例對象

  def main(args: Array[String]): Unit = { 
    println("hello scala") 
  }

}

當單例對象與某個類共享同一個名稱時,他被稱做是這個類的伴生對象:companion object。你必須在同一個源文件裏定義類和它的伴生對象。類被稱爲是這個單例對象的伴生類:companion class。類和它的伴生對象能夠互相訪問其私有成員。

類和單例對象間的一個差異是,單例對象不帶參數,而類能夠。由於你不能用new關鍵字實例化一個單例對象,你沒機會傳遞給它參數。每一個單例對象都被做爲由一個靜態變量指向的虛構類:synthetic class的一個實例來實現(虛構類的名字是對象名加上一個美圓符號。如單例對象ChecksumAccumulator的虛構類是ChecksumAccumulator$),所以它們與Java靜態類有着相同的初始化語法。單例對象會在第一次被訪問的時候初始化。

不與伴生類共享名稱的單例對象被稱爲孤立對象:standalone object。因爲不少種緣由你會用到它,包括把相關的功能方法收集在一塊兒,或定義一個Scala應用的入口點。(上面的小例子就是一個孤立對象)

7.Scala隱式引用了包java.lang和scala的成員,和名爲Predef的單例對象的成員,到每一個Scala源文件中。Predef,被放置在包scala中,包含了許多有用的方法。例如,當在Scala源文件中寫pringln的時候,你實際調用了Predef的println。(Predef.pringln運轉並調用Console.println,作實際的工做。)當你寫assert,你是在調用Predef.assert。

8.Scala裏,你能夠任意命名.scala文件,而不用考慮裏面放了什麼Scala類或代碼。這點與Java不一樣,java要求類名與文件名相同。

Scala編譯器 scalac xxx.scala

Scala快速編譯器 fsc xxx.scala  //第一次執行fsc時,會建立一個綁定在你計算機端口上的本地服務器後臺進程。

中止fsc後臺進程可執行fsc –shutdown

9.Application特質

Scala提供了一個特質,scala.Application,能夠節省你一些手指的輸入工做。

使用這個特質的方法是,首先在你的單例對象名後面寫上「extends Application」 。而後代之以main方法,你能夠把想要放在main方法裏的代碼直接放在單例對象的大括號之間。就這麼簡單。以後能夠像對其它程序那樣編譯和運行。

import ChecksumAccumulator.calculate

object Demo extends Application {//一個單例對象 
    println("hello scala")
}

這種方式之因此能奏效是由於特質Application聲明瞭帶有合適的簽名的main方法,並由你的單例對象繼承,使它能夠像個Scala程序那樣用。大括號之間的代碼被收集進了單例對象的主構造器:primary constructor,並在類被初始化時被執行。

繼承自Application比寫個顯式的main方法要短,不過它也有些缺點。首先,若是想訪問命令行參數的話就不能用它,由於args數組不可訪問。第二,由於某些JVM線程模型裏的侷限,若是你的程序是多線程的就須要顯式的main方法。最後,某些JVM的實現沒有優化被Application特質執行的對象的初始化代碼。所以只有當你的程序相對簡單和單線程狀況下你才能夠繼承Application特質。

相關文章
相關標籤/搜索