final的小tip

在阅读源码的时候会经常在方法里看到很多的final常量定义,开始很不解,主要是不明白为何这样写,jvm有优化吗?经过一番折腾,了解了个大概。

一、final常量:

通过RednaxelaFX大在知乎的回答和thinking in java(jdk1.6版)的描述(http://www.zhihu.com/question/21762917/answer/19239387?utm_source=weibo&utm_medium=weibo_share&utm_content=share_answer&utm_campaign=share_button)可以得出:

1、除了变量折叠这种“优化”(因为编译期就可以确定结果),其实并没有带来什么好处(除非比较简陋的不智能的VM,没有动态优化),只是通过编译器保证此变量无法被重新赋值

2、有时候在方法里代码会有很多变量,但是一些变量你不希望自己不小心重新赋给它一个新的值(比如刚进来的HttpServletRequest,用户提交的username、password等信息,则在方法里声明时声明为final防止意外),其实如果你尝试去用final就会发现,我们其实用不了那么多的变量,但是java不像scala有类型推断,那么多的关键字总是看着有些累赘

二、final方法:

1、private方法为隐性的final方法,因为你无法重写

2、早期的JDK的确对final方法有优化,那时候将一个方法定义为final意味着调用这个final方法可以使此方法在原方法里展开(可以理解为没有这个final方法,它的代码属于原方法了,此情况如果被调用方法很长,反而会降低效率,得不偿失),而不是原来的创建一个新的栈帧给被调用的final方法,,压入虚拟机栈,JVM的PC指向下一条指令即此例中final方法的代码处跳转执行,代码展开后它们共享操作数栈和局部变量表,还少了一次方法跳转,现在的VM会根据情况来对方法进行展开,优化去掉展开后效率反而降低的情况,所以如今final方法只是在编译期保证方法无法被重写了


你可能感兴趣的:(final的小tip)