In Scala, difference between final val and val [du

2019-02-03 00:52发布

This question already has an answer here:

In Scala, what is the difference between

val a = 1

and

final val fa = 1

3条回答
Viruses.
2楼-- · 2019-02-03 01:12

You also cannot use non-final vals in (Java) annotations.

For example, this:

@GameRegistry.ObjectHolder(Reference.MOD_ID)
object ModItems{
}

will only compile if MOD_ID is declared as final.

查看更多
做个烂人
3楼-- · 2019-02-03 01:21

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.

查看更多
4楼-- · 2019-02-03 01:28

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

查看更多
登录 后发表回答