根据《Scala for the Impatient》中第8章Table8-2所列的内容
Override def with var: A var can override agetter/setter pair. Overriding just a getter is an error.
怎样理解这句话呢,首先就要从scala对var变量的定义说起了。
在scala中定义了一个var变量,会自动生成getter和setter方法,那么如果父类中定义了一个方法def id: Int,用来生成用户的id,那么如果子类用var变量重写这个方法的话override var id = 90,编译会报错“method id_=overrides nothing”,从报错中可以看出来,由于var自动生成了一个setter方法(id_),但是父类并没有这个方法,所以是无法重写的。
除非在父类中也定义了setter方法,例如像下面这个Person类
abstract class
Person {
def id:
Int
def id_=(value:
Int):Unit
= {}
}
这种情况子类中用var重写def id方法是可以的,准确的说是同时重写了父类中的这两个方法
classStudent extends Person{ override var id = 90 }
综上,用var重写父类中的def在大多数的场景下都是会报错的。只有上述的一种情况才可以。