Mic*_*jac 60

final 成员不能在子类或特征中被覆盖.

法律:

class A {
    val a = 1
}

class B extends A {
    override val a = 2
}
Run Code Online (Sandbox Code Playgroud)

非法:

class A {
    final val a = 1
}

class B extends A {
    override val a = 2
}
Run Code Online (Sandbox Code Playgroud)

你会收到这样的错误:

:9:错误:覆盖Int(1)类的A类中的值a;

值a不能覆盖最终成员


win*_*ner 11

在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
}
Run Code Online (Sandbox Code Playgroud)

另外,正如为什么`private val`和`private final val`不同?,如果一个final val字段持有一个"常量值",一个常量的基本类型,对它的访问将被字节码替换,直接加载该值.