In Scala, difference between final val and val [duplicate]

Solution 1:

final members cannot be overridden, say, in a sub-class or trait.

Legal:

class A {
    val a = 1
}

class B extends A {
    override val a = 2
}

Illegal:

class A {
    final val a = 1
}

class B extends A {
    override val a = 2
}

You'll get an error such as this:

:9: error: overriding value a in class A of type Int(1);

value a cannot override final member

Solution 2:

In Scala, final declares that a member may not be overridden in subclasses. For example:

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
}

Also, as discussed in Why are `private val` and `private final val` different?, if a final val field is holding a "constant value", a constant primitive type, access to it will be replaced with the bytecode to load that value directly.