在Scala中,
之间有什么区别val a = 1
和
final val fa = 1
答案 0 :(得分:51)
final
成员不能在子类或特征中被覆盖。
法律:
class A {
val a = 1
}
class B extends A {
override val a = 2
}
非法:
class A {
final val a = 1
}
class B extends A {
override val a = 2
}
您将收到如下错误:
:9:错误:覆盖Int(1)类的A类中的值a;
值a不能覆盖最终成员
答案 1 :(得分:9)
在Scala中,final
声明可能不会在子类中覆盖成员。例如:
class Parent {
val a = 1
final val b = 2
}
class Subclass extends Parent {
override val a = 3 // this line will compile
override val b = 4 // this line will not compile
}
另外,正如Why are `private val` and `private final val` different?中所讨论的,如果final val
字段持有“常量值”,一个常量基本类型,对它的访问将被字节码替换以直接加载该值。
答案 2 :(得分:2)
您也不能在(Java)注释中使用非final
val
。
例如,这个:
@GameRegistry.ObjectHolder(Reference.MOD_ID)
object ModItems{
}
只有在MOD_ID
声明为final
时才会编译。