方法中的内部类访问局部变量的时候,局部变量需要被 final 关键字修饰。因为方法中的代码是由上而下顺序执行的,方法运行结束后,局部变量就被销毁,内部类的生命周期可能会比局部变量的生命周期长;看下面的代码,方法中的内部类 Inner.class 调用方法中的局部变量 x ,正常调用的时候内部类能够调用到方法中的局部变量,并将内部类对象 inner 返回,正常调用结束后,如果方法中的局部变量 x 没有被 final 关键字修饰,x 则会被销毁,我们再通过反射的方式去调用 x 的时候则会发现找不到变量 x ,如果局部变量 x 被 final 关键字修饰后,则 x 在方法运行结束后不会被销毁,而是常驻在内存中直到 JVM 退出,这样再通过反射调用的时候依然可以找到 x 。
import java.lang.reflect.Method;
class Outer {
public Object outerfun() {
final int x = 5;
class Inner {
public void innerfun() {
System.out.println(x);
}
}
Inner inner = new Inner();
inner.innerfun();
return inner;
}
} 作者: 疲劳的小马 时间: 2014-2-17 18:40
内部类定义在局部时
1,不可以被成员修饰符修饰(private static等)
2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量
class Outer
{
int x = 3;
void method(final int a)
{
final int y = 4;
class Inner //内部类定义在局部 成员函数中
{
void function()
{
System.out.println(y);//访问局部变量y,y必须是final
System.out.println(a);//访问局部变量a,a必须是final
}
}
new Inner().function();
}
}
复制代码
作者: apples_benben 时间: 2014-2-17 18:41
在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final 或abstract 修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加final 修饰符。
在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称:
public class Outer {
public void start() {
new Thread(
new Runable(){
public void run(){};
}
).start();
}
}