java类方法中使用内部类的参数问题
2014-10-23 10:22
281 查看
1.问题:
public class Test{private int a = 1;
static int b = 2;
public void method(){
final int c = 3;
int d = 4;
class Cinner {
public void mymethod(){
//Here a、b、c、d哪些参数可以调用
}
}
}
}
答案为:abc
内部类参数必须为final类型
2.原因:
局部变量的生命周期与局部内部类的对象的生命周期的不一致性!
设方法method()被调用后,在栈中生成了变量d,此时产生了一个局部内部类Cinner,它访问了局部变量d,当方法methos()结束时,局部变量d就会死亡,但局部内部类对象Cinner还可能一直的存在(当没有人再引用该对象时,它才会死亡),它不会随着方法method()运行结束死亡,这时就出现了一个错误结果,局部内部类对象Cinner要访问一个已经不存在的局部变量d3.java中解决方法:
当变量是final时,通过final局部变量“复制”一份,复制品直接作为局部内部中的数据成员,当局部内部类访问局部变量时,其实真正访问的是这个局部变量的“复制品”,因此就算当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以访问局部变量(真正访问为“复制品”),给人感觉好像局部变量的生命期延长了。4.总结:
这个规定是一种无可奈何,同时也说明程序语言的设计时受到实现技术的限制的,这就是一个例子,大家更多关心的是如何设计和思考,对于技术上的实现觉得无关紧要,只要设计好,都能实现。参见:http://feiyeguohai.iteye.com/blog/1500108
相关文章推荐
- java 引用类型作为方法参数使用问题
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- 最新的PHP java bridge使用方法和遇到的问题
- java方法参数传递问题
- 使用OWC 做图表时按周、月、年设置时间刻度是参数无效问题解决方法
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- java中方法参数的使用
- Java使用Oracle遇到的最大游标超出问题及其解决方法
- java使用String.split方法时遇到的问题(转载)
- Java使用Oracle遇到的最大游标超出问题及其解决方法
- 关于java代码中的注释问题。(类中方法的注释,我们一般都要写上这个方法的文档(doc),方法的参数也要有它的文档)
- JAVA中对同一问题分别使用内部类与匿名内部类实现
- Java中匿名内部类的使用方法
- Effective Java Item2:当构造方法的参数(尤其是可选参数)比较多时使用Builder模式
- Java使用Oracle遇到的最大游标超出问题及其解决方法
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- java adf 使用ajax传递参数中有中文乱码问题(转)
- 使用JAVA的反射机制反射带有数组参数的私有方法
- JAVA中对同一问题分别使用内部类与匿名内部类实现
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用