黑马程序员技术交流社区
标题:
方法中定义的final常量存放在内存的什么地方?
[打印本页]
作者:
面具猴
时间:
2014-11-1 10:24
标题:
方法中定义的final常量存放在内存的什么地方?
本帖最后由 面具猴 于 2014-11-18 09:32 编辑
方法中定义的final常量存放在内存的什么地方?
还是方法的栈中吗?
是在堆中吗?
是在常量池中吗?
它肯定会被释放或者叫回收,那它在什么时候被释放?
作者:
微笑凡
时间:
2014-11-1 10:48
我们知道static在静态存储区 final在常量区 ,static final存储在静态区的。。。
Java中的static变量是在类加载的时候最先载入的。
(1) 编译期常数,它永远不会改变
对于编译期的常数,编译器(程序)可将常数值“封装”到需要的计算过程里。也就是说,计算可在编译期间提前执行,从而节省运行时的一些开销。在Java中,这些形式的常数必须属于基本数据类型(Primitives),而且要用final关键字进行表达。在对这样的一个常数进行定义的时候,必须给出一个值。
无论static还是final字段,都只能存储一个数据,而且不得改变。
若随同对象句柄使用final,而不是基本数据类型,它的含义就稍微让人有点儿迷糊了。对于基本数据类型,final会将值变成一个常数;但对于对象句柄,final会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。Java对此未提供任何手段,可将一个对象直接变成一个常数(但是,我们可自己编写一个类,使其中的对象具有“常数”效果)。这一限制也适用于数组,它也属于对象。
(2) 在运行期初始化的一个值,我们不希望它发生变化
尽管被声明成final,但却未得到一个初始值。无论在哪种情况下,空白final都必须在实际使用前得到正确的初始化。而且编译器会主动保证这一规定得以贯彻。然而,对于final关键字的各种应用,空白final具有最大的灵活性。举个例子来说,位于类内部的一个final字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。
作者:
面具猴
时间:
2014-11-1 11:46
微笑凡 发表于 2014-11-1 10:48
我们知道static在静态存储区 final在常量区 ,static final存储在静态区的。。。
Java中的static变量是在类 ...
谢谢回复,我明白了。。
final int num=10;
System.out.println(num);
后面这句在编译完成后其实就变成了:
System.out.println(10);
作者:
未来就在那
时间:
2014-11-1 11:53
查看大神们的回帖!
作者:
戏言丶
时间:
2014-11-1 14:52
来学习一下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2