黑马程序员技术交流社区

标题: 关于final修饰方法局部变量问题 [打印本页]

作者: shijianws    时间: 2014-7-24 04:36
标题: 关于final修饰方法局部变量问题
方法中普通局部变量在方法执行完被释放,那么被final修饰后呢
作者: 风吹落叶    时间: 2014-7-24 08:13
垃圾回收机制  随着类的消失而消失
作者: 依然超级赛亚人    时间: 2014-7-24 08:38
本帖最后由 依然超级赛亚人 于 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修饰这个变量让它成为常量而不被释放。不知这样说阁下是否明白?
作者: 依然超级赛亚人    时间: 2014-7-24 08:43
不好意思,上面有一句说错了,纯属失误。错误在六行,不是“在内部类中定义了一个内部类”,而是在方法(外部类的方法method())中定义了一个内部类。脑袋当时短路了,请见谅!
作者: shijianws    时间: 2014-7-24 13:37
非常感谢(^_^)
作者: liuniansis    时间: 2014-7-24 15:37
我查询了一下资料,目前有两种说法,一种就是前面那位所说的,另一种说法是,内部类和外部类编译后会生成两份字节码文件,当运行时两份字节码文件被加载进内存中时,如果变量是外部类的成员变量,那么内部类的字节码是无法引用到变量的,为了可以引用到此变量,将变量声明为final,即为常量,他会被存储到方法区,此时两份字节码都可以使用到此常量
作者: zeus00456    时间: 2014-7-28 14:48
依然被释放。
这个可以用下面的代码验证
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的成员变量。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2