《快学Scala》——继承

2019-03-28

扩展类

Scala扩展类的方式和Java一样也是使用extends关键字。和Java一样,你在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法。和Java一样,你也可以将类声明为final,这样它就不能被扩展。你还可以将单个方法或字段申明为final,以确保他们不能被重写。
注: final 代表子类不能重载这个值, val 没有这个含义,只是做了运行时不能改变值得约束。

重写方法

  • 在Scala中重写一个抽象方法必须使用override修饰符。
  • 在Scala中调用超类的方法和Java完全一样,使用super关键字。

类型检查和转换

要测试某个对象是否属于某个给定的类,就可以用isInstanceOf方法。如果测试成功,你就可以用asInstanceOf方法将引用转换为子类的引用:

if (p. isInstanceOf[Employee]) {
    val s = p. asInstanceOf[Emplyee]    //s的类型为Emloyee
    …
}

如果p指向的是Employee类及其子类(比如Manager)的对象,则p. isInstanceOf[Employee]将会成功。

如果你想要测试p指向的是一个Employee对象但又不是其子类的话可以用: if (p.getClass == classOf[Employee])

超类的构造

类有一个主构造器和任意数量的辅助构造器,而每个辅助构造器都必须以对先前定义的辅助构造器或主构造器的调用开始。

所以,辅助构造器永远不能直接调用超类的构造器。子类的辅助构造器最终都会调用主构造器,只有主构造器可以调用超类的构造器。
示例如下:
class Employee(name: String, age: Int, val salary: Double) extends Person(name, age)

定义一个子类和一个调用超类构造器的主构造器,主构造器的参数中的两个传给超类。

重写字段

重写的限制:

  • def 只能重写要给def
  • val 只能重写另一个val或不带参数的def
  • var 只能重写另一个抽象的var

抽象类和抽象字段

和Java一样,你可以用abstract关键字来标记不能被实例化的类,通常这是因为他的某个或某几个方法没有被完整定义。在Scala中,不需要对抽象方法使用abstract关键字,只需要省去方法体即可。如果某个类至少存在一个抽象方法,则该类必须声明为abstract

除了抽象方法外,类还可以拥有抽象字段。抽象字段就是一个没有初始值的字段。
注: 非抽象类,申明字段必须赋值。