在Scala中,最终val和val之间的差异

时间:2014-07-23 13:22:24

标签: scala immutability

在Scala中,

之间有什么区别
val a = 1

final val fa = 1

3 个答案:

答案 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时才会编译