黑马程序员技术交流社区

标题: 局部内部类疑问 [打印本页]

作者: 执笔画梦    时间: 2015-1-9 17:55
标题: 局部内部类疑问
内部类在局部位置上只能访问局部中被final修饰的局部变量
怎么理解这句话
作者: godmmm    时间: 2015-1-9 20:04
这个用生命周期来判断,你的内部类对象是在内部类的后面new出来的吧,这个时候可能你的局部代码已经执行完了,如果是这样,局部变量已经消失。你的内部类可能会访问局部变量,这样一访问就出问题了,所以不能这样定义。而final修饰后这个变量就变成类变量了,只要类在,就一直存在的。
作者: 常尚全    时间: 2015-1-9 20:11
final修饰的,可以理解为永恒存在,别的东东死了,他还在。所以可以访问,不然你访问个死人。就访问不到了
作者: AtheerCHA    时间: 2015-1-9 20:18
很好理解当内部类定义在局部中时,因为局部中的变量在局部运算完后会被释放,使用final修饰可以与类的使用生命周期相同。
作者: bin393973282    时间: 2015-1-9 21:45
又是这个经典问题
作者: lwj123    时间: 2015-1-9 22:11
public class Demo1 {
        public static void main(String[] args) {
                final String str = "局部内部类访问‘常量’";// 定义一个局部变量
                new Thread(new Runnable() {// 在内部类里访问局部变量str
                                        public void run() {
                                                for (int i = 0; i < 100; i++) {
                                                        System.out.println(str + " " + i);// 访问到str局部变量
                                                        try {
                                                                Thread.sleep(100);
                                                        } catch (Exception ex) {
                                                        }
                                                }
                                        }
                                }).start();
        }
}
当main执行完之后,其他线程不一定会执行完,它还需要访问str这个变量,所以为了访问这个变量,就需要将这个变量定义为final,就是说这个变量是常量了,不会再改变了。如果不加上这句话的话,编译会报错。
作者: cgsilen    时间: 2015-1-9 22:29
好吧又是这个问题,多看几遍视频就明白了
作者: 邓士林    时间: 2015-1-9 22:40
形式上可以看懂看看这个解释:
1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的
2)为什么JAVA中要加上一条限制:只能访问final型的局部变量?
局部变量的生命周期与局部内部类的对象的生命周期的不一致性!
所以要限制为final
作者: 只会金克斯    时间: 2015-1-11 12:38
局部变量会在方法调用完毕后,会在栈内存中立马消失。
而局部内部类中如果有地方使用着局部变量,当方法消失后,
这个方法区中的内容还没有消失,也就是说这个变量还必须存在。
所以,为了延长局部变量的生命周期,就加final修饰了
作者: gecl    时间: 2015-1-11 13:07
下周学到这。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2