局部内部类访问方法的参数和局部变量必须是final的
2016-11-29 09:40
260 查看
内部类的种类一共分为四种,我看其他几种内部类的时候思路都是很清晰的,然后我就碰到了这一条:“方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问”。于是我就有点疑惑,为什么必须是final的?
于是我就试了一下访问不是final的变量,发现eclipse给出了错误提示:Cannot refer to the non-final local variable localVal defined in an enclosing scope。不能在一个即将关闭的作用域内尝试引用一个非final的变量。差不多我就理解了,因为方法内的参数或者是局部变量的话,当这个方法执行结束之后,它们也就被释放了。加入内部类中的一个引用指向了这个局部变量,再次尝试访问时,就会发生错误。
给出下面的例子:
[html] view plain copy
public class AnonymousClass {
public Object makeInner(String localVal){
return new Object(){
private String s = localVal;
public String toString(){
return s;
}
};
}
public static void main(String[] args) {
AnonymousClass ac = new AnonymousClass();
Object ob = ac.makeInner("23");
System.out.println(o.toString());
}
}
程序new了一个类对象,然后调用了makeInner方法,传递了一个String类型的参数,进入到方法内部,返回了一个内部匿名类。匿名类中成员引用变量s跟参数localVal指向相同的内存地址,并在重写的toString方法中,返回了成员变量s。调用结束,localVal指向的内存空间释放,返回到主程序,调用ob的toString方法,输出s,但是此时的s指向的内存地址已经被释放了,所以程序是不会让你这么干的。所以内部类访问所在方法的参数或局部变量为什么必须是final的,因为方法结束之后他们空间并没有释放,依然是有效的。
于是我就试了一下访问不是final的变量,发现eclipse给出了错误提示:Cannot refer to the non-final local variable localVal defined in an enclosing scope。不能在一个即将关闭的作用域内尝试引用一个非final的变量。差不多我就理解了,因为方法内的参数或者是局部变量的话,当这个方法执行结束之后,它们也就被释放了。加入内部类中的一个引用指向了这个局部变量,再次尝试访问时,就会发生错误。
给出下面的例子:
[html] view plain copy
public class AnonymousClass {
public Object makeInner(String localVal){
return new Object(){
private String s = localVal;
public String toString(){
return s;
}
};
}
public static void main(String[] args) {
AnonymousClass ac = new AnonymousClass();
Object ob = ac.makeInner("23");
System.out.println(o.toString());
}
}
程序new了一个类对象,然后调用了makeInner方法,传递了一个String类型的参数,进入到方法内部,返回了一个内部匿名类。匿名类中成员引用变量s跟参数localVal指向相同的内存地址,并在重写的toString方法中,返回了成员变量s。调用结束,localVal指向的内存空间释放,返回到主程序,调用ob的toString方法,输出s,但是此时的s指向的内存地址已经被释放了,所以程序是不会让你这么干的。所以内部类访问所在方法的参数或局部变量为什么必须是final的,因为方法结束之后他们空间并没有释放,依然是有效的。
相关文章推荐
- 关于局部内部类访问所在方法的参数或局部变量为什么必须是final的
- Java--局部内部类在访问他所在方法中的局部变量必须用final修饰
- 局部内部类只能访问方法内被final修饰的局部变量
- 为什么局部内部类访问外边的局部变量必须为final?
- 为什么局部内部类访问局部变量,局部变量必须声明为final?
- Java 局部内部类访问局部变量必须加final关键字
- 局部内部类 局部内部类访问局部变量必须用final修饰
- 为什么匿名内部类访问当前方法的局部变量必须为final类型
- 局部内部类访问外部的局部变量时,为什么要求局部变量必须加上final
- 局部内部类为什么访问方法中的局部变量时局部变量要加final
- Java 局部内部类访问局部变量必须加 final 关键字
- 局部内部类访问方法中的局部变量为什么加final
- 匿名内部类访问外部类的实例方法的局部变量时,局部变量必须是final
- 匿名内部类访问外部类中的局部变量必须是final属性
- 【面试对宝典40题的解释】匿名内部类访问外部类中的局部变量必须是final属性
- java中内部类访问局部变量的时候,为什么变量必须加上final修饰
- 为什么匿名内部类调用的方法内局部变量必须为final
- 方法里的局部内部类为什么不能访问一般的方法里的局部变量?
- 局部内部类只能访问被final修饰的局部变量
- 为什么匿名内部类调用的方法内局部变量必须为final