- 類之間最基本的兩個關(guān)系:組合和繼承沟使。組合和繼承是使用現(xiàn)有的類創(chuàng)建一個新類的方法渊跋。組合的關(guān)系是一個類可以包括對另一個類的引用着倾,來幫助它完成任務(wù)燕少;繼承則是子類和超類的關(guān)系。
抽象類
- 包含抽象成員的類本身也要聲明為抽象的崇决,在類
class
前面加上abstract
底挫,沒有實(shí)現(xiàn)的方法自動就是抽象的建邓,不用使用abstract
修飾符進(jìn)行修飾。
無參方法
def width(): Int // 空圓括號方法 def width: Int // 無參方法
- 如果沒有參數(shù)沸手,推薦的是使用無參方法(不改變狀態(tài)的狀態(tài)下)注簿,因為要支持所謂的統(tǒng)一訪問原則,使用方的代碼不受到某個屬性是方法還是字段實(shí)現(xiàn)的影響捐晶。如果是無參的方法妄辩,在理論上都是可以省去圓括號的,但是如果該參數(shù)有副作用泣棋,比如說輸出到屏幕或者修改了狀態(tài)畔塔,最好還是使用
()
進(jìn)行標(biāo)注提醒鸯屿,如果僅僅是訪問某個屬性,則可以省略谅辣。
extends
-
extends
繼承了超類的所有非私有成員婶恼。而且如果子類中已經(jīng)實(shí)現(xiàn)了相同名稱和參數(shù)的成員柏副,成為子類重寫了超類的成員割择。如果子類是具體的萎河,超類的抽象的,也可以是子類實(shí)現(xiàn)了超類玛歌。
-
- 子類型的意思是子類的值可以被用在任何使用超類值的場合擎椰。
- 在
Scala
中字段和方法屬于用一個命名空間∫胲瘢可以使用字段來重寫無參方法休弃。
Scala
中的命名空間只有值(字段,方法篙骡、包和單例對象)和類型(類和特質(zhì)名)丈甸∧览蓿可以使用val
來重寫一個無參方法。同時不允許無參方法和val
有同樣的標(biāo)識符淘正。
- 在
-
class A(val a: Int)
同時定義了類參數(shù)和同名字段臼闻。也可以使用var
定義,也可以在字段上添加訪問修飾符惩淳。
-
- 調(diào)用超類主構(gòu)造方法的語法:
class LineElement(s: String) extends ArrayElement(Array(s)) {……}
- 子類在重寫了超類字段和方法的時候乓搬,是需要明確加上
override
關(guān)鍵字的。不小心出現(xiàn)的重寫激蹲,是脆弱基類問題最常見的表現(xiàn)方式。主要表現(xiàn)為如果你想在繼承關(guān)系中的基類中添加新的成員含蓉,將面臨破壞使用方代碼的風(fēng)險项郊,比如使用方早就定義了你要添加的新的成員方法。
- 子類在重寫了超類字段和方法的時候乓搬,是需要明確加上
多態(tài)和動態(tài)綁定
- 一個超類的變量可以存在多種子類形態(tài)差油,這種現(xiàn)象稱為多態(tài)任洞。
- 對變量和表達(dá)式的方法調(diào)用是動態(tài)綁定,實(shí)際被調(diào)用的方法實(shí)現(xiàn)是基于運(yùn)行時的對象中的方法妆偏,而不是變量來決定的钱骂。
聲明final成員
-
final
成員不能被子類繼承挪鹏。final
類不能被繼承。
定義工廠對象
- 工廠對象中包含了創(chuàng)建其他對象的方法解取。使用方使用工廠對象構(gòu)造對象返顺,而不是直接
new
,這樣使得對象創(chuàng)建邏輯可以被集中起來创南,對象是如何使用具體的類被表示伦忠,這樣的邏輯可以被隱藏起來省核。暴露的細(xì)節(jié)少稿辙,提供了更多的機(jī)會在未來不破壞使用方代碼的前提下修改類庫的實(shí)現(xiàn)。
- 工廠對象中包含了創(chuàng)建其他對象的方法解取。使用方使用工廠對象構(gòu)造對象返顺,而不是直接
- 一般是將創(chuàng)建對象的工廠對象放在類的伴生對象中气忠,也就是單例對象中邻储。這樣可以隱藏實(shí)現(xiàn)類的細(xì)節(jié)赋咽。如果實(shí)現(xiàn)類不需要想被暴露的話,可以將實(shí)現(xiàn)類放在單例對象中聲明為
private
屬性吨娜。Scala
中允許在單例和類中定義單例和類脓匿。
- 一般是將創(chuàng)建對象的工廠對象放在類的伴生對象中气忠,也就是單例對象中邻储。這樣可以隱藏實(shí)現(xiàn)類的細(xì)節(jié)赋咽。如果實(shí)現(xiàn)類不需要想被暴露的話,可以將實(shí)現(xiàn)類放在單例對象中聲明為