5.Scala 類和對象 (二)

前面提到Scala比Java更加面向?qū)ο蟠侥粒@是因?yàn)镾cala不允許類保護(hù)靜態(tài)元素(靜態(tài)變量或靜態(tài)方法)。在Scala中提供類似功能的是成為“Singleton(單例對象)“的對象丐重。在Scala中定義Singleton對象的方法除了使用object腔召,而非class關(guān)鍵字外和類定義非常類似,下面例子創(chuàng)建一個ChecksumAccumulator對象:
1

object
ChecksumAccumulator {

2

private
val
cache
=
Map [String, Int] ()

3

def
calculate(s
:
String)
:
Int
=

4

if
(cache.contains(s))

5

cache(s)

6

else
{

7

val
acc
=
new
ChecksumAccumulator

8

for
( c <- s)

9

acc.add(c.toByte)

10

val
cs
=
acc.checksum()

11

cache +

( s -> cs)

12

cs

13

}

14

}

這個對象和上一篇創(chuàng)建的類ChecksumAccumulator同名扮惦,這在Scala中把這個對象成為其同名的類的“伴侶”對象(Companion object)臀蛛。 如果你需要定義的類的companion對象,Scala要求你把這兩個定義放在同一個文件中崖蜜。類和其companion對象可以互相訪問對方的私有成員浊仆。如果你是Java成員,可以把Singleton對象看成以前Java定義靜態(tài)成員的地方豫领。你可以使用類似Java靜態(tài)方法的方式調(diào)用Singleton對象的方法抡柿,比如下面為這個例子完整的代碼:
1

import
scala.collection.mutable.Map

2

class
ChecksumAccumulator{

3

private
var
sum
=
0

4

def
add(b
:
Byte)
:
Unit
=
sum +
=
b

5

def
checksum()
:
Int
=
~ (sum &
0xFF
) +
1

6

}

7

8

object
ChecksumAccumulator {

9

private
val
cache
=
Map [String, Int] ()

10

def
calculate(s
:
String)
:
Int
=

11

if
(cache.contains(s))

12

cache(s)

13

else
{

14

val
acc
=
new
ChecksumAccumulator

15

for
( c <- s)

16

acc.add(c.toByte)

17

val
cs
=
acc.checksum()

18

cache +

( s -> cs)

19

cs

20

}

21

}

22

23

println ( ChecksumAccumulator.calculate(
"Welcome to Scala Chinese community"
))

Scala 的singleton對象不僅限于作為靜態(tài)對象的容器,它在Scala中也是頭等公民等恐,但僅僅定義Singleton對象本身不會創(chuàng)建一個新的類型洲劣,你不可以使用new再創(chuàng)建一個新的Singleton對象(這也是Singleton名字的由來),此外和類定義不同的是鼠锈,singleton對象不可以帶參數(shù)(類定義參數(shù)將在后面文章介紹)闪檬。
回過頭來看看我們的第一個例子”Hello World“。
1

object
HelloWorld {

2

def
main(args
:
Array[String]) {

3

println(
"Hello, world!"
)

4

}

5

}

這是一個最簡單的Scala程序,HelloWorld 是一個Singleton對象购笆,它包含一個main方法(可以支持命令行參數(shù))粗悯,和Java類似,Scala中任何Singleto對象同欠,如果包含main方法,都可以作為應(yīng)用的入口點(diǎn)。在這里要說明一點(diǎn)的是盖呼,在Scala中不要求public類定義和其文件名同名鲤屡,不過使用和public類和文件同名還是有它的優(yōu)點(diǎn)的闪萄,你可以根據(jù)個人喜好決定是否遵循Java文件命名風(fēng)格。最后提一下Scala的trait功能,Scala的trait 和Java 的Interface相比,可以有方法的實(shí)現(xiàn)(這點(diǎn)有點(diǎn)像抽象類,但如果是抽象類膛锭,就不會允許繼承多個抽象類)。Scala的Trait支持類和Singleton對象和多個Trait混合(使用來自這些Trait中的方法蚊荣,而不時不違反單一繼承的原則)初狰。Scala為Singleton對象的main定義了一個App trait類型,因此上面的例子可以簡化為:
1

object
HelloWorld
extends
App{

2

println(
"Hello, world!"
)

3

}

這段代碼就不能作為腳本運(yùn)行互例,Scala的腳本要求代碼最后以表達(dá)式結(jié)束奢入。因此運(yùn)行這段代碼,需要先編譯這段代碼:scalac Helloworld.scala
編譯好之后媳叨,運(yùn)行該應(yīng)用
scala HelloWord
注意: Scala提供了一個快速編譯代碼的輔助命令fsc (fast scala compliler) 腥光,使用這個命令,只在第一次使用fsc時啟動JVM,之后fsc在后臺運(yùn)行糊秆,這樣就避免每次使用scalac時都要載入相關(guān)庫文件武福,從而提高編譯速度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痘番,一起剝皮案震驚了整個濱河市艘儒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夫偶,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件觉增,死亡現(xiàn)場離奇詭異兵拢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逾礁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門说铃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘹履,你說我怎么就攤上這事腻扇。” “怎么了砾嫉?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵幼苛,是天一觀的道長。 經(jīng)常有香客問我焕刮,道長舶沿,這世上最難降的妖魔是什么墙杯? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮括荡,結(jié)果婚禮上高镐,老公的妹妹穿的比我還像新娘。我一直安慰自己畸冲,他們只是感情好嫉髓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邑闲,像睡著了一般算行。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上监憎,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天纱意,我揣著相機(jī)與錄音,去河邊找鬼鲸阔。 笑死偷霉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褐筛。 我是一名探鬼主播类少,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渔扎!你這毒婦竟也來了硫狞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晃痴,失蹤者是張志新(化名)和其女友劉穎残吩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倘核,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泣侮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了紧唱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片活尊。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漏益,靈堂內(nèi)的尸體忽然破棺而出蛹锰,到底是詐尸還是另有隱情,我是刑警寧澤绰疤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布铜犬,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翎苫。R本人自食惡果不足惜权埠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煎谍。 院中可真熱鬧攘蔽,春花似錦、人聲如沸呐粘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽作岖。三九已至唆垃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痘儡,已是汗流浹背辕万。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沉删,地道東北人渐尿。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像矾瑰,于是被迫代替她去往敵國和親砖茸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容