A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 面具猴 于 2014-11-18 09:32 编辑

方法中定义的final常量存放在内存的什么地方?
还是方法的栈中吗?
是在堆中吗?
是在常量池中吗?
它肯定会被释放或者叫回收,那它在什么时候被释放?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

4 个回复

倒序浏览
我们知道static在静态存储区 final在常量区 ,static final存储在静态区的。。。
Java中的static变量是在类加载的时候最先载入的。

(1) 编译期常数,它永远不会改变
对于编译期的常数,编译器(程序)可将常数值“封装”到需要的计算过程里。也就是说,计算可在编译期间提前执行,从而节省运行时的一些开销。在Java中,这些形式的常数必须属于基本数据类型(Primitives),而且要用final关键字进行表达。在对这样的一个常数进行定义的时候,必须给出一个值。
无论static还是final字段,都只能存储一个数据,而且不得改变。
若随同对象句柄使用final,而不是基本数据类型,它的含义就稍微让人有点儿迷糊了。对于基本数据类型,final会将值变成一个常数;但对于对象句柄,final会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。Java对此未提供任何手段,可将一个对象直接变成一个常数(但是,我们可自己编写一个类,使其中的对象具有“常数”效果)。这一限制也适用于数组,它也属于对象。

(2) 在运行期初始化的一个值,我们不希望它发生变化
尽管被声明成final,但却未得到一个初始值。无论在哪种情况下,空白final都必须在实际使用前得到正确的初始化。而且编译器会主动保证这一规定得以贯彻。然而,对于final关键字的各种应用,空白final具有最大的灵活性。举个例子来说,位于类内部的一个final字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
微笑凡 发表于 2014-11-1 10:48
我们知道static在静态存储区 final在常量区 ,static final存储在静态区的。。。
Java中的static变量是在类 ...

谢谢回复,我明白了。。
final int num=10;
System.out.println(num);
后面这句在编译完成后其实就变成了:
System.out.println(10);
回复 使用道具 举报
查看大神们的回帖!
回复 使用道具 举报
来学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马