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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© shijianws 中级黑马   /  2014-7-24 04:36  /  1620 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

方法中普通局部变量在方法执行完被释放,那么被final修饰后呢

6 个回复

倒序浏览
垃圾回收机制  随着类的消失而消失
回复 使用道具 举报
本帖最后由 依然超级赛亚人 于 2014-7-24 08:47 编辑

不会被释放。它修饰的变量已经被放到常量区。这一点在局部内部类那一块有很好的证明,请看下面这部分代码:
class Outer {
        //在外部类中定义一个方法
        public void method() {
                final int num = 100;//用final修饰变量,便于内部类Inner继续使用。
              //在方法中定义一个内部类,也就是局部内部类
                class Inner        {
                        public void show() {
                                System.out.println(num);
                        }
                }

                //创建对象,调用方法
                Inner i = new Inner();
                i.show();
        }
}

class InnerClassDemo4 {
        public static void main(String[] args) {
                Outer o = new Outer();
                o.method();
        }
}

稍微解释一下:方法在调用完毕后就会带着它内部的变量一起被释放。但是,请注意,它内部的类不会立即被释放。所以,上面的程序如果不用final修饰变量,那么编译时就会报错。简单来说,就是方法内部的类比变普通量(此时还没被final修饰)释放的晚,内部类如果还想用这个变量的话,就得用final修饰这个变量让它成为常量而不被释放。不知这样说阁下是否明白?
回复 使用道具 举报
不好意思,上面有一句说错了,纯属失误。错误在六行,不是“在内部类中定义了一个内部类”,而是在方法(外部类的方法method())中定义了一个内部类。脑袋当时短路了,请见谅!
回复 使用道具 举报
非常感谢(^_^)
回复 使用道具 举报
我查询了一下资料,目前有两种说法,一种就是前面那位所说的,另一种说法是,内部类和外部类编译后会生成两份字节码文件,当运行时两份字节码文件被加载进内存中时,如果变量是外部类的成员变量,那么内部类的字节码是无法引用到变量的,为了可以引用到此变量,将变量声明为final,即为常量,他会被存储到方法区,此时两份字节码都可以使用到此常量
回复 使用道具 举报
依然被释放。
这个可以用下面的代码验证
public static void main(String[] args) {
                show();
                System.out.println(a);
        }
        public static void show() {
                final int a = 0;
                System.out.println(a);               
        }
使用主方法调用show方法
show方法中定义了一个被final修饰的变量a
我们从show方法中打印a是没有问题的
假设,final变量在方法结束后不释放,那么我们在主方法中再次打印此变量也是可行的
经试验,报错,“a connot be resolved to a variable”,a 不能作为一个变量被访问

上面的依然超级赛亚人同学的说法个人认为和lz问的对不上,lz说的是final的局部变量,而他说的是final的成员变量。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马