java类方法中使用内部类的参数问题

来源:互联网 发布:淘宝hd 2.6.1版本 编辑:程序博客网 时间:2024/05/16 19:18

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(){//Herea、b、c、d哪些参数可以调用}}}}


一般理解:Cinner类可以调用adcd四个参数,当是受到java技术的限制

答案为:abc  

内部类参数必须为final类型


2.原因:

局部变量的生命周期与局部内部类的对象的生命周期的不一致性!

设方法method()被调用后,在栈中生成了变量d,此时产生了一个局部内部类Cinner,它访问了局部变量d,当方法methos()结束时,局部变量d就会死亡,但局部内部类对象Cinner还可能一直的存在(当没有人再引用该对象时,它才会死亡),它不会随着方法method()运行结束死亡,这时就出现了一个错误结果,局部内部类对象Cinner要访问一个已经不存在的局部变量d

3.java中解决方法:


当变量是final时,通过final局部变量“复制”一份,复制品直接作为局部内部中的数据成员,当局部内部类访问局部变量时,其实真正访问的是这个局部变量的“复制品”,因此就算当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以访问局部变量(真正访问为“复制品”),给人感觉好像局部变量的生命期延长了。

4.总结:

这个规定是一种无可奈何,同时也说明程序语言的设计时受到实现技术的限制的,这就是一个例子,大家更多关心的是如何设计和思考,对于技术上的实现觉得无关紧要,只要设计好,都能实现。

参见:http://feiyeguohai.iteye.com/blog/1500108

0 0
原创粉丝点击