「大數據」(九十六)Scala之繼承

【導讀:數據是二十一世紀的石油,蘊含巨大價值,這是·情報通·大數據技術系列第[96]篇文章,歡迎閱讀和收藏】

1 基本概念

繼承是 面向對象 軟件技術當中的一個概念。如果一個類別 A“ 繼承自 ” 另一個類別 B ,就把這個 A 稱為 “B 的子類別 ” ,而把 B 稱為 “A 的父類別 ” 也可以稱 “B 是 A 的超類 ” 。繼承可以使得子類別具有父類別的各種屬性和方法,而不需要再次編寫相同的代碼。在令子類別繼承父類別的同時,可以重新定義某些屬性,並重寫某些方法,即覆蓋父類別的原有屬性和方法,使其獲得與父類別不同的功能。

2 術語解釋

繼承 :是 面向對象 軟件技術當中的一個概念,與多態、封裝共為面向對象的三個基本特徵。 繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等

3 詳細說明

Scala 中,讓子類繼承父類,與 Java 一樣,也是使用 extends 關鍵字 .

繼承就代表,子類可以從父類繼承父類的 field 和 method ;然後子類可以在自己內部放入父類所沒有,子類特有的 field 和 method ;使用繼承可以有效複用代碼

子類可以覆蓋父類的 field 和 method ;但是如果父類用 final 修飾, field 和 method 用 final 修飾,則該類是無法被繼承的, field 和 method 是無法被覆蓋的

<code>class Person {

private var name = "leo"

def getName = name
}

class Student extends Person {

private var score = "A"

def getScore = score
}/<code>

Scala 中,如果子類要覆蓋一個父類中的非抽象方法,則必須使用 override 關鍵字

override 關鍵字可以幫助我們儘早地發現代碼裡的錯誤,比如: override 修飾的父類方法的方法名我們拼寫錯了;比如要覆蓋的父類方法的參數我們寫錯了;等等

此外,在子類覆蓋父類方法之後,如果我們在子類中就是要調用父類的被覆蓋的方法呢?那就可以使用 super 關鍵字,顯式地指定要調用父類的方法 :

<code>class Person {

private var name = "leo"

def getName = name

}

class Student extends Person {



private var score = "A"

def getScore = score

override def getName = "Hi, I'm " + super.getName

}/<code>

Scala 中,子類可以覆蓋父類的 val field ,而且子類的 val field 還可以覆蓋父類的 val field 的 getter 方法;只要在子類中使用 override 關鍵字即可 :

<code>class Person {

val name: String = "Person"

def age: Int = 0
}

class Student extends Person {

override val name: String = "leo"

override val age: Int = 30
}

/<code>

如果我們創建了子類的對象,但是又將其賦予了父類類型的變量。則在後續的程序中,我們又需要將父類類型的變量轉換為子類類型的變量,應該如何做?

首先,需要使用 isInstanceOf 判斷對象是否是指定類的對象,如果是的話,則可以使用 asInstanceOf 將對象轉換為指定類型

注意,如果對象是 null ,則 isInstanceOf 一定返回 false , asInstanceOf 一定返回 null

注意,如果沒有用 isInstanceOf 先判斷對象是否為指定類的實例,就直接用 asInstanceOf 轉換,則可能會拋出異常 :

<code>class Person

class Student extends Person

val p: Person =  new Student

var s: Student = null

if (p.isInstanceOf[Student]) s = p.asInstanceOf[Student]/<code>

isInstanceOf 只能判斷出對象是否是指定類以及其子類的對象,而不能精確判斷出,對象就是指定類的對象

如果要求精確地判斷對象就是指定類的對象,那麼就只能使用 getClass 和 classOf 了 . 對象 .getClass 可以精確獲取對象的類, classOf[ 類 ] 可以精確獲取類,然後使用 == 操作符即可判斷

<code>class Person

class Student extends Person

val p: Person = new Student

p.isInstanceOf[Person]

p.getClass == classOf[Person]

p.getClass == classOf[Student]/<code>