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
println(parent.age)
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 var age:Int = 5 }
|