Java程式設計者一分鐘上手Scala
類的宣告
Scala的OOP是可以建立類的。但類的宣告過程與Java的不同。下面來看下在Scala裡是怎麼做的:
class Person
|
看起來很簡單——也是,我們只是聲明瞭一個沒什麼功能的類。讓我們繼續看下該怎麼來完善程式碼,使其成為一個更有實際用途的類。
主建構函式
我需要在物件建立的時候加幾個特定的引數到Person類裡面。你大概猜到了,我在說的是主建構函式。
class Person(name:
String, age: Int) |
我們在建立物件時可以直接呼叫主建構函式,看下這個例子:
val
p1 = new Person( "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類的外部獲取它們值時就出錯了。
class Person(val
name: String, var age: Int)
|
我修改了下Person類的宣告。現在引數name有了getter,因為它有一個字首val。引數age在getter基礎上還多了setter,因為它有一個字首var(譯者注:其實譯者個人覺得把val和var分別理解為Java里加了final和沒加final的變數更直觀些)。
scala>
val p2 = new Person( "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的類可以有更實際的功能——當它們類的主體裡多了一些函式時。
class Person(val
name:String, var age:Int) {
def
introduce() =println(s "Hi,
my name is ${name}, I'm ${age} years old" )
}
|
現在Person類的一個例項裡,他/她變的更社交化了,可以把他/她自己介紹給別人了。看下面程式碼:
val
p3 = new Person( "Jhon" , 33 )
p3.introduce
|
小結
在這篇文章裡我試著對Scala裡最簡單和最基本的OOP用法做一個概述。在我印象中,Scala的OOP要比Java的更復雜——或者也不能說是更復雜,但它確實跟Java的有不同點,必須花上一些時間來適應它。