4.3 类继承
在Scala里,继承一个基类跟Java的做法很相似,只多了两点限制:1. 重写方法需要override关键字;2. 只有主构造函数才能往基类构造函数中传参数。
在Scala里,重写方法必须使用override关键字。Java 5引入了override注解,但并不强制使用。而Scala则强制使用这个关键字,降低了敲错方法名带来的风险。比如你可能不小心改写了一个本不想改写的方法,或者本来想改写基类的方法,结果写出了一个新方法。
Scala的副构造函数必须调用主构造函数或者是另一个副构造函数。只有在主构造函数中才能向基类的构造函数传参数。在Scala里,主构造函数如同一道关卡,类的实例通过它初始化,初始化过程中与基类的交互也通过它进行控制。
下面是继承一个基类的例子:
ScalaForTheJavaEyes/Vehicle.scala
class Vehicle(val id: Int, val year: Int) {
override def toString() : String = "ID: " + id+ " Year: " + year
}
class Car(override val id: Int, override val year: Int,
var fuelLevel: Int) extends Vehicle(id, year) {
override def toString() : String = super.toString() + " Fuel Level: "
+ fuelLevel
}
val car = new Car(1, 2009, 100)
println(car)
以下是程序的输出:
ID: 1 Year: 2009 Fuel Level: 100
在继承Vehicle
类的时候,我们向基类传了参数。这些参数应该能够匹配上基类的某一个构造函数。因为Car
中的id
和year
属性源于Vehicle
,所以我们在Car
的主构造函数的参数中用了override
关键字来表明这一点。此外,因为要重写java.lang.Object
的toString()
方法,我们在Vehicle
和Car
的toString()
方法前都加了override
前缀。