【導讀:數據是二十一世紀的石油,蘊含巨大價值,這是·情報通·大數據技術系列第[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>
閱讀更多 情報通 的文章