「大数据」(九十六)Scala之继承

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[96]篇文章,欢迎阅读和收藏】

1 基本概念

继承是 面向对象 软件技术当中的一个概念。如果一个类别 A“ 继承自 ” 另一个类别 B ,就把这个 A 称为 “B 的子类别 ” ,而把 B 称为 “A 的父类别 ” 也可以称 “B 是 A 的超类 ” 。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。

2 术语解释

继承 :是 面向对象 软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。 继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等

「大数据」(九十六)Scala之继承

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>


分享到:


相關文章: