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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test {
        public static void main(String[] args) {
                new Test().method("haha");
        }
       
        public void method(final String name) {        //为什么这里的参数一定要是final才能都传给内部类用呢
                new Thread(new Runnable() {
                        public void run() {
                                System.out.println(name);
                        }
                }).start();
        }
       
}

还有final修饰的变量,是存放在栈上面吗?还是存放在别的什么地方?

6 个回复

倒序浏览
因为Java采用了一种copy   local   variable   的方式来实现,也就是说把定义为final的局部变量拷贝过来用,而引用的也可以拿过来用,只是不能重新赋值。从而造成了可以access   local   variable的假象

而这个时候由于不能重新赋值,所以一般不会造成不可预料的事情发生
回复 使用道具 举报
这是上次我问别人的,我保存了答案。

首先在方法中定义一个内部类,但是它并不是方法的一部分,我们只是这样写代码,
目的是为了控制内部类的可见性,编译之后的结果,也会出现 外部类 和 内部类各自的字节码class文件,
这就说明内部类是一个独立的个体,他们就是两个类而已,他们各自都有自己的成员变量和方法。
并且方法的属性与内部类的生命周期不同。方法内的属性会被分配到内存中栈中的,
当方法调用结束的时候就会退栈,也就是说在内存中这个属性就消失了,然而这个内部类会被分配到堆内存中,
生命还在,并没有消失。如果让内部类再使用被销毁的属性这并不合理。
解决方法就是加上final关键字。在java中, 某个属性一旦加上final关键字,就 可以看作是常量,
而常量的生命周期在程序的整个执行期间都是有效的。所有这个时候的属性的生命周期变的比内部类更长了。所以可以引用, 不会出错。

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
明白你的意思了,就是说内部类是分配在堆中的,为了防止内部类使用会消失的局部变量,所以就把这个变量定义成final的,让这个变量变成常量,存放在常量池里面,这样就不会出错误了,谢谢你啊,讲的很透彻,我也懂了很多
问题已解决
回复 使用道具 举报
final修饰的变量是常量,常量的生命周期比方法要大,常量要等main函数执行完后才被JVM垃圾回收器回收,如果你不定义final,函数被调用完后就无法在用类去访问函数中的变量,因为那个变量已经被当垃圾回收了
回复 使用道具 举报
杨文宇 发表于 2012-8-4 23:34
这是上次我问别人的,我保存了答案。

首先在方法中定义一个内部类,但是它并不是方法的一部分,我们只是这 ...

受教了,看来我自己的理解还是有些片面
回复 使用道具 举报
杨文宇 发表于 2012-8-4 23:34
这是上次我问别人的,我保存了答案。

首先在方法中定义一个内部类,但是它并不是方法的一部分,我们只是这 ...

这个回答相当不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马