- final:
可以修饰类:则该类不能被继承,属性默认也是 final 的
可以修饰方法:则该方法不能被重写(网上认为 final 比非 final 快,就是认为它是在编译的时候已经静态绑定了,不需要在运行时再动态绑定。这个可能以前的JVM上是正确的,但在现代的JVM上,这个可以认为没什么影响)
可以修饰属性:则该类的属性不会进行隐式的初始化(只初始化一次,但可多次读取) ,也就是必须赋值final int a=1,正确;fianl int a;错误。
或者在构造方法中赋值
以上两种方式选择一种
可以修饰变量:则只可以赋值一次,那么就是常量了
- final和非final的性能:
对于是否有 final 修饰的方法,对性能的影响可以忽略不计。因为它们生成的字节码除了 flags 标志位是否有 final 修饰不同之外,其他所有的JVM指令,都是一样的(对于方法本身,以及调用者本身的字节码都一样)。对于JVM来说,它执行的就是字节码,如果字节码都一样的话,那对于JVM来说,它就是同一样东西的了。使用 final ,更多的应该是根据Java对 final 的语义来定义,而不是只想着为了提升性能(而且这影响可以忽略不计)而刻意用 final.