不会被释放。它修饰的变量已经被放到常量区。这一点在局部内部类那一块有很好的证明,请看下面这部分代码:
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 不能作为一个变量被访问