1. 程式人生 > >Java程式設計者一分鐘上手Scala

Java程式設計者一分鐘上手Scala

大部分時間裡我是使用Java程式設計的,它是我的主要程式語言。對我而言,各方面的需求它都可以滿足,但有時覺得它太“重”了——這也是我為什麼開始使用Scala。我現在的業餘時間裡都在學習Scala。我打算寫一些學習筆記在部落格裡,因此你可以在我部落格中看到一些關於Scala內容的新文章(譯者注:作者的部落格地址是http://fruzenshtein.com/,本站後續也會翻譯他關於Scala的新文章)。第一篇先從Scala的OOP開始。

類的宣告

Scala的OOP是可以建立類的。但類的宣告過程與Java的不同。下面來看下在Scala裡是怎麼做的:

classPerson

看起來很簡單——也是,我們只是聲明瞭一個沒什麼功能的類。讓我們繼續看下該怎麼來完善程式碼,使其成為一個更有實際用途的類。

主建構函式

我需要在物件建立的時候加幾個特定的引數到Person類裡面。你大概猜到了,我在說的是主建構函式。

classPerson(name: String, age: Int)

我們在建立物件時可以直接呼叫主建構函式,看下這個例子:

val p1 = newPerson("Alex",24)

當然,主建構函式也可以被間接的呼叫在過載的構造器裡。過載已經超出了本文的範疇,我會在以後的文章裡來討論它。

字首的建構函式引數

好了,我們已經聲明瞭Person類,它看起來也或多或少的有了些實際用處。它已經可以通過主建構函式來初始化一些引數。但我們初始化之後的這些引數是怎麼互動的呢?

scala> p1.name <console>:10: error: value name is not a member of Person
p1.name

正像你所看到的,想直接來獲取Person例項裡的name引數出錯了。那是因為name引數在主建構函式宣告那沒有任何字首。因此引數name和age都被預設宣告成了私有的(private),所以在Person類的外部獲取它們值時就出錯了。

classPerson(val name: String, var age: Int)

我修改了下Person類的宣告。現在引數name有了getter,因為它有一個字首val。引數age在getter基礎上還多了setter,因為它有一個字首var(譯者注:其實譯者個人覺得把val和var分別理解為Java里加了final和沒加final的變數更直觀些)。

scala> val p2 = newPerson("Bobby",25) p2: Person = Person@30374534 scala> p2.name res1: String = Bobby scala> p2.name = "Bob" <console>:9: error: reassignment to val p2.name = "Bob" scala> p2.age res2: Int = 25 scala> p2.age = 26 p2.age: Int = 26

在主建構函式裡用上字首val和var,讓你的類更有實際功能了。

類的主體

讓我們繼續看下Scala裡關於OOP的基礎。我現在想展示下Scala的類可以有更實際的功能——當它們類的主體裡多了一些函式時。

classPerson(val name:String, var age:Int) { def introduce() =println(s"Hi, my name is ${name}, I'm ${age} years old") }

現在Person類的一個例項裡,他/她變的更社交化了,可以把他/她自己介紹給別人了。看下面程式碼:

val p3 = newPerson("Jhon",33) p3.introduce

小結

在這篇文章裡我試著對Scala裡最簡單和最基本的OOP用法做一個概述。在我印象中,Scala的OOP要比Java的更復雜——或者也不能說是更復雜,但它確實跟Java的有不同點,必須花上一些時間來適應它。