关于 java 中 final 的几个疑问
-
final 是什么
final : 字面意思就是不可变的,其也可以理解成最终的东西,不可变的。它可以修饰类、可以修饰属性、可以修饰方法
final 修饰类,表示这个类不可以被继承
final 修饰方法,表示子类不可以重写这个方法
final 修饰属性,表示这个属性的值是不可变的 或者说 这个对象的地址空间是不可变的 -
final 的生命周期
如果,final 修饰的东西是不可变的,那么它会不会使得内存变得特别的高呢?比如final修饰的局部变量呢?
final 只是指这个东西是不可变的。而它是什么时候被回收(生命周期),是随着class而变化的。再说白了一些就是,当这个属性或者对象不被使用的时候,就是会被 GC 回收的 -
final 与多线程 或者 内部类
不可变对象(final)在本质上是线程安全的,它们不要求同步。因此,当多个线程并发访问这样对象的时候,它们是不会遭到破坏的。于是,我们在多线程的时候,就可以使用这个关键字(final)作为线程间的参数传递。
关于另一种在多线程间使用final的说法:
参考网址:http://www.cnblogs.com/dreamroute/p/5079277.html
在一个线程A中开起另一个线程B,如果线程B要使用线程A的局部变量,那么A的局部变量需要定义成final。理由:局部变量是线程内部共享的,每一个线程内的不能访问其他线程的局部变量。而为什么加上final就可以访问了呢?原因是加上final之后,在创建B线程的时候会把final标记的变量作为线程B的构造方法的参数传给B,如此一来就解决了此问题,这是一个比较巧妙的做法,通过class文件反编译可以看出这个道理。 -
当我在查看带有final的.class文件时候,发现,final修饰的对象是可以重新赋值的。这明显和之前所说的final的不可变是差别的。于是,查看了相关的文档,以及自己的理解得出结论:
参考网址:https://blog.csdn.net/imu2008/article/details/49632879
我的理解就是,这是jvm对final的一种妥协。一种什么样的妥协呢?就是我们在写代码的时候,它并不知道我们的final是什么时候才会真正的第一次初始化。所以,它在写的时候,就干脆不允许我们这样写了,而在编译的时候,.class文件又可以那样写的
欢迎大家提出自己的想法,我也会持续的整理,方便大家学习理解的