scala学习笔记-继承

1. 扩展类

scala扩展类的方式与Java一样——使用extends关键字

类声明为final就不能被扩展

单个方法或字段声明为final,可以确保不能重写(Java中final字段是不可变的,类似scala中的val)

2. 重写方法

在scala中重写一个非抽象方法必须使用override修饰符,调用超类使用super关键字。

3. 类型检查和转换

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

scala学习笔记-继承

4. 受保护字段和方法

与Java相同,protected关键字修饰的成员可以被任何子类访问,但不能从其他位置看到

与Java不同,protected的成员对于类所属的包而言是不可见的

scala还提供了一个protected[this]的变体,将访问权限定在当前的对象

5. 超类的构造

辅助构造器永远不能直接调用超类的构造器。子类的辅助构造器最终都会调用主构造器。只有主构造器可以调用超类的构造器

6. 重写字段

scala的字段由一个私有字段和取值器/改值器方法构成。可以用另一个同名的val字段重写一个val(或者不带参数的def)。子类有一个私有字段和一个公有的getter方法,而这个getter方法重写了超类的getter方法。例如:

class Person(val name:String){

override def toString=getClass.getName+"[name="+name+"]"

}

class SecretAgent( codename:String) extends Person(codename){

override val name="secret"

override val toString="secret"

}

注意如下限制:

def 只能重写另一个def

val只能重写另一个val或不带参数的def

var只能重写另一个抽象的var

scala学习笔记-继承


7. 匿名子类

和java一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类,例如:

val alien=new Person("Fred"){

def greeting = "Greetings, Earthling! My name is Fred."

}

8. 抽象类

和Java一样,可以使用abstract关键字标记不能被实例化的类,通常这是因为它的某个或者某几个方法没有被完整定义。例如:

abstract class Person( val name : String){

def id:Int  //没有方法体

}

9. 抽象字段

除了抽象方法外,类还可以拥有抽象字段。抽象字段就是一个没有初始化数值的字段。例如:

abstract class Person{

val  id :Int  //没有初始化——一个带有抽象的getter方法的抽象字段

var  name:String  //抽象字段,带有抽象的getter和setter方法

}

10. 构造顺序和提前定义

当你在子类中重写val并且在超类的构造器中使用该值的话,其行为并不那么显而易见。

11. scala继承层级

scala学习笔记-继承