1. 程式人生 > >scala成長之路(2)對象和類

scala成長之路(2)對象和類

ascii int 紅色 部分 類名 基類 req 字面量 標識符

scala提供了一種特殊的定義單例的方法:object關鍵字

scala> object Shabi{
| val age = 0
| val name = "shabi"
| def say = {
| println("hello, I am a shabi")
| }
| }
defined object Shabi

scala> Shabi.say
hello, I am a shabi

object定義的單例可以類比於java中的靜態元素,也類似於enum,可以直接import後調用。

正常定義類scala用的是class關鍵字,註意這裏可以在類名的後天添加參數列表,表示主構造函數參數,而主構造函數主體就是類定義中除了類成員函數定義以外的部分:

package test.wangyalou

class Rational(n:Int, s:Int){
    require(s != 0)
    var num = n
    var sub = s
    override def toString() = num + "/" + sub
    def add(other:Rational) = {
        var subtotal = sub * other.sub
        var numtotal = sub * other.num + num * other.sub
        val mintotal 
= subtotal min numtotal for(i <- 2 to mintotal){ while (numtotal % i == 0 && subtotal % i == 0){ subtotal /= i numtotal /= i } } new
Rational(numtotal, subtotal) } val big = n / s var isFalse = false isFalse
= if(num > sub) true else false val initmin = num min sub for (i <- 2 to initmin){ while(num % i == 0 && sub % i == 0){ num /= i sub /= i } } }

註意在上邊的代碼中,除了黃色和綠色的成員函數代碼以及紅色的成員變量聲明代碼外,其余代碼均為構造函數代碼。這裏的require作用類似於java中的assert,即如果不滿足條件就報錯。

在scala中還有一種輔助構造函數,使用def this(){...},但是記住,所有輔助構造函數的第一句必須顯式調用其他構造函數:

    def this(num:Int) = {
        this(num,1)
    }
  


因此無論調用哪個構造函數最終都一定會調用到主構造函數,這是與java很大的一點不同!而且只有主構造函數中才能調用基類構造函數!
scala的標識符包括:普遍意義的標識符、符號標識符,以及字面量標識符。

第一種不多說,需要註意的是$字符也被當作是字母,但是被保留作為 Scala 編譯器產生的標識符之用。用戶程序裏的標識符不應該包含$字符,盡管能夠編譯通過;

第二種包括一些如 + , : , ? , ~ 或 #的可打印的ASCII字符。以下是一些操作符標識符的例子: + ++ ::: <?> :->,Scala 編譯器將內部“粉碎”操作符標識符以轉換成合法的內嵌’$’的 Java 標識符。例如, 標識符:->將被內部表達為 $colon$minus$greater 。 若你想從 Java 代碼訪問這個標識符,就應使用這個內部表達。

第三種也稱為文本標識符,即反單引號包含的任意字符,這樣的好處是可以將變量或方法命名為沖突的字符、保留字符或關鍵字,最典型的就是Thread類的`yield`方法,調用方式為Thread1.`yield`

和java一樣,scala也支持方法的重載,根據方法參數的不同可以定義同一個方法的不同重載形式。例如定義Rational的整數add方法:

    def add(intnum:Int) = {
        add(new Rational(intnum,1)
    }



scala成長之路(2)對象和類