快速學(xué)習(xí)Scala之繼承

類的繼承

在Scala中讓子類繼承父類與Java一樣也是使用extends關(guān)鍵字吹散。繼承就代表子類可以從父類繼承父類的field和method弧械;子類可以在自己內(nèi)部放入父類所沒有子類特有的field和method;使用繼承可以有效復(fù)用代碼空民。
子類可以覆蓋父類的field和method刃唐;但是用final修飾的class無法被繼承的,field和method無法被覆蓋袭景。

定義父類

/**
 * 定義人種抽象類
 * 只要存在一個抽象方法即為abstract class唁桩。
 */
abstract class Human(val lang:String,val skin:String="黃色"){
    val lang = lang
    val skin = skin
    print("這是在主構(gòu)造器中的代碼")
    //自我介紹,抽象方法
    def intro(nationality : String="Chinese") : Unit
}

定義子類

/**
 * 定義黃種人
 * 
 */
class YellowRace(lang:String="Chinese",skin:String="黃色") extends Human(lang,skin){  
    ...  
}

重寫

重寫字段或者類的屬性耸棒、方法的時候使用override關(guān)鍵字荒澡。子類覆蓋父類方法之后,在子類中要調(diào)用父類的被覆蓋的方法時使用super關(guān)鍵字与殃,顯式地指定要調(diào)用父類的方法单山。

重寫方法

override def intro(nationality : String) : Unit = {
    println("我是" + skin + "人種,我說" + lang+",我來自"+nationality)
}

重寫字段field

Scala中幅疼,子類可以覆蓋父類的val field米奸,而且子類的val field還可以覆蓋父類的val field的getter方法;只要在子類中使用override關(guān)鍵字即可爽篷。

val lang:String = "英語"
val skin:String = "白色"

類型判斷

isInstanceOf 和 asInstanceOf

如果創(chuàng)建了子類的對象悴晰,又將其賦予了父類類型的變量,則在后續(xù)的程序中需要將父類類型的變量轉(zhuǎn)換為子類類型的變量,應(yīng)該如何做铡溪?首先使用isInstanceOf判斷對象是否是指定類的對象胚鸯,如果是的話刑桑,則可以使用asInstanceOf將對象轉(zhuǎn)換為指定類型伪很。
如果對象是null毛甲,則isInstanceOf一定返回false,asInstanceOf一定返回null哈扮; 如果沒有用isInstanceOf先判斷對象是否為指定類的實(shí)例纬纪,就直接用asInstanceOf轉(zhuǎn)換,則可能會拋出異常

val chinese : Human = new Chinese
val zgr : Chinese = null
if(chinese.isInstanceOf[Chinese]) zgr = chinese.asInstanceOf[Chinese]

getClass 和classOf

isInstanceOf只能判斷出對象是否是指定類以及其子類的對象滑肉,而不能精確判斷出對象就是指定類的對象包各。如果要求精確地判斷對象就是指定類的對象那么就只能使用getClass和classOf了。對象.getClass可以精確獲取對象的類赦邻,classOf[類]可以精確獲取類髓棋,然后使用==操作符即可判斷

if(chinese.getClass == classOf[Chinese]) zgr = chinese.asInstanceOf[Chinese]

模式匹配

這種方式更加地簡潔明了,而且代碼得可維護(hù)性和可擴(kuò)展性也非常的高惶洲。使用模式匹配功能性上來說與isInstanceOf一樣按声,也是判斷主要是該類以及該類的子類的對象即可,不是精準(zhǔn)判斷的恬吕。

val chinese : Human = new Chinese
chinese match{
    case c:Chinese=>...
    case _ =>
}

protected

跟java一樣scala中同樣可以使用protected關(guān)鍵字來修飾field和method签则,這樣在子類中就不需要super關(guān)鍵字,直接就可以訪問field和method;還可以使用protected[this]铐料,則只能在當(dāng)前子類對象中訪問父類的field和method渐裂,無法通過其他子類對象訪問父類的field和method。

調(diào)用父類的構(gòu)造方法

Scala中每個類可以有一個主constructor和任意多個輔助constructor钠惩,而每個輔助constructor的第一行都必須是調(diào)用其他輔助constructor或者是主constructor柒凉;因此子類的輔助constructor是一定不可能直接調(diào)用父類的constructor的,只能在子類的主constructor中調(diào)用父類的constructor篓跛。如果是父類中接收的參數(shù)子類中接收時就不要用任何val或var來修飾了膝捞,否則會認(rèn)為是子類要覆蓋父類的field。

abstract class Human(lang:String,skin:String="黃色")
class YellowRace(lang:String="Chinese",skin:String="黃色") extends Human(lang,skin){  
    ...  
}

抽象類

如果在父類中有某些方法無法立即實(shí)現(xiàn)愧沟,需要依賴不同的子來來覆蓋蔬咬,重寫實(shí)現(xiàn)自己不同的方法實(shí)現(xiàn)。此時可以將父類中的這些方法不給出具體的實(shí)現(xiàn)沐寺,只有方法簽名林艘,這種方法就是抽象方法。一個類中如果有一個抽象方法混坞,那么類就必須用abstract來聲明為抽象類狐援,此時抽象類是不可以實(shí)例化的。在子類中覆蓋抽象類的抽象方法時,不需要使用override關(guān)鍵字咕村。

/**
 * 定義人種抽象類
 * 只要存在一個抽象方法即為abstract class场钉。
 */
abstract class Human(lang:String,skin:String="黃色"){
    val lang = lang
    val skin = skin
    print("這是在主構(gòu)造器中的代碼")
    //自我介紹蚊俺,抽象方法
    def intro(nationality : String="Chinese") : Unit
}

創(chuàng)建類對象及方法的使用

//使用構(gòu)造方法中的默認(rèn)參數(shù)或者傳入明確的參數(shù)值
val chinese = new Chinese()
//調(diào)用自我介紹方法
chinese.inftro("中國")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懈涛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泳猬,更是在濱河造成了極大的恐慌批钠,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件得封,死亡現(xiàn)場離奇詭異埋心,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忙上,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門拷呆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疫粥,你說我怎么就攤上這事茬斧。” “怎么了梗逮?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵项秉,是天一觀的道長。 經(jīng)常有香客問我慷彤,道長娄蔼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任底哗,我火速辦了婚禮岁诉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跋选。我一直安慰自己涕癣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布野建。 她就那樣靜靜地躺著属划,像睡著了一般。 火紅的嫁衣襯著肌膚如雪候生。 梳的紋絲不亂的頭發(fā)上同眯,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音唯鸭,去河邊找鬼须蜗。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的明肮。 我是一名探鬼主播菱农,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柿估!你這毒婦竟也來了循未?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤秫舌,失蹤者是張志新(化名)和其女友劉穎的妖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體足陨,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫂粟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了墨缘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片星虹。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镊讼,靈堂內(nèi)的尸體忽然破棺而出宽涌,到底是詐尸還是另有隱情,我是刑警寧澤狠毯,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布护糖,位于F島的核電站,受9級特大地震影響嚼松,放射性物質(zhì)發(fā)生泄漏嫡良。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一献酗、第九天 我趴在偏房一處隱蔽的房頂上張望寝受。 院中可真熱鬧,春花似錦罕偎、人聲如沸很澄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甩苛。三九已至,卻和暖如春俏站,著一層夾襖步出監(jiān)牢的瞬間讯蒲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工肄扎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墨林,地道東北人赁酝。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像旭等,于是被迫代替她去往敵國和親酌呆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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