0%

scala继承

scala继承

scala与java一样,也存在继承,且也支持单继承,同样使用extends关键字(如果将类声明为final,就不能被继承。如果将方法或字段声明为final,就不能被重写)

语法

1
class 子类名 extends 父类名 { 类体 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
object TestExtends {
def main(args: Array[String]): Unit = {
val tiger = new Tiger
tiger.name = "东北虎"
tiger.sayHello
tiger.run
}
}

class Animal {
var name: String = _

def sayHello: Unit = {
println("你好,我是" + name)
}
}

class Tiger extends Animal {

def run: Unit = {
println("I can run")
}
}

注意:只有主构造器可以调用父类的构造器

方法重写

同样的,scala中也是拥有方法重写的,不过在方法重写的时候,scala中明确规定重写一个非抽象方法需要用override修饰符,如果要调用父类的方法使用super来调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Animal {
var name: String = _

def sayHello: Unit = {
println("你好,我是" + name)
}

def who:Unit = {
println("我是动物")
}
}

class Tiger extends Animal {

def run: Unit = {
println("I can run")
}

// 方法重写
override def who: Unit = {
println("我是老虎,森林之王")
}
}

字段重写

java中是不存在字段重写的,只有方法重写,在java中只存在字段隐藏,而scala中如果子类拥有父类中相同的字段,需要使用override来修饰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Parent{
val age:Int = 20
}

class Child extends Parent{
override val age:Int = 5
}


val parent:Parent = new Child
val child:Child = new Child
// 5
println(parent.age)
// 5
println(child.age)

上述为什么都会获取到5,是因为scala会自动生成age()方法来获取age字段值,而方法是存在重写的,导致了获取到的都是子类的字段值

这里注意在重写时要用val来定义字段,因为可变的对象不能被重写mutable variable cannot be overridden

如果使用var定义字段的话,只能重写抽象的var(没有初始化的字段,要求类也是抽象类)

1
2
3
4
5
6
7
8
9
10
// 抽象类
abstract class Parent{
// 抽象字段
var age:Int
}

class Child extends Parent{
// 本质上是实现了抽象方法,override可省略
override var age:Int = 5
}

欢迎关注我的其它发布渠道