scala学习笔记-继承
1. 扩展类
scala扩展类的方式与Java一样——使用extends关键字
类声明为final就不能被扩展
单个方法或字段声明为final,可以确保不能重写(Java中final字段是不可变的,类似scala中的val)
2. 重写方法
在scala中重写一个非抽象方法必须使用override修饰符,调用超类使用super关键字。
3. 类型检查和转换
要测试某个对象是否属于某个给定的类,可以用isInstenceOf方法。如果测试成功,可以用asInstanceOf方法将引用转换为子类引用
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
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继承层级