Scala 类的继承特点:
1. Scala 是单继承
2. Scala 子类重写父类的非抽象方法,属性必须使用override 关键字
3. Scala 继承关键字extends
看一个例子:
class Point(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("x 的坐标点 : " + x);
println ("y 的坐标点 : " + y);
}
}
class Location(override val xc: Int, override val yc: Int,
val zc :Int) extends Point(xc, yc){
var z: Int = zc
def move(dx: Int, dy: Int, dz: Int) {
x = x + dx
y = y + dy
z = z + dz
println ("x 的坐标点 : " + x);
println ("y 的坐标点 : " + y);
println ("z 的坐标点 : " + z);
}
}
object Test {
def main(args: Array[String]) {
val loc = new Location(10, 20, 15);
// 移到一个新的位置
loc.move(10, 10, 5);
}
}
说明:
1. Locatoin 继续 Point 是单继承
2. 在 new Location(10, 20, 15)时,
2.1 10,与20率先传递给Point(10, 20)
2.2 Location 中的 需要使用override 关键字,且必须是val
3. Location 中的move 与 Point中的move不是同一函数,所以Location中的move并不是重写父类Point中的move,其实是重载所以不用加 override关键字
override 的理解: 即使是下面的情况也必须用override,因为Location传入的是Point的两个参数,必须用override关键字
class Point(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
}
class Location(override val xc: Int, override val yc: Int) extends Point(xc, yc){
}
在看一个override 的例子,子类重写父类的属性:
class Day(val month: Int, val year: Int) {
val name = "test"
override def toString: String = name + "***"
}
class Date(override val month: Int, override val year: Int) extends Day(month, year) {
override val name = "data"
}
object Test {
def main(args: Array[String]) {
val d = new Date(1, 2009)
println (d)
}
}
output:
data***
说明: Date子类,使用关键字override重写了父类的name 属性,调用 toString时name值已经被改写了.
1. 如果父类Day中, name是这样定义的 var name = "test",那么子类中就不必使用override关键字
可以直接 name = "data"
2. 构造器Day,Date 必须使用val,否则会报: Cannot override a mutable Variable Class 具体原因我后面在看看。
子类调用父类方法:
lass Day(val month: Int, val year: Int) {
val name = "test"
def get(u:Int):Int = {
return u + 1
}
override def toString: String = name + "***"
}
class Date(override val month: Int, override val year: Int) extends Day(month, year) {
override val name = "data"
override def get(u: Int): Int = {
val data = super.get(u)
return data + 3
}
}
object Test {
def main(args: Array[String]) {
val d = new Date(1, 2009)
println (d.get(3))
}
}
说明: 子类调用父类方法: super.get(4)
一点要强调: 子类重写了父类的属性name后,子类中不能使用super.name调用父类的name