A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 执笔画梦 中级黑马   /  2015-1-9 17:55  /  2272 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内部类在局部位置上只能访问局部中被final修饰的局部变量
怎么理解这句话

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

9 个回复

倒序浏览
这个用生命周期来判断,你的内部类对象是在内部类的后面new出来的吧,这个时候可能你的局部代码已经执行完了,如果是这样,局部变量已经消失。你的内部类可能会访问局部变量,这样一访问就出问题了,所以不能这样定义。而final修饰后这个变量就变成类变量了,只要类在,就一直存在的。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
final修饰的,可以理解为永恒存在,别的东东死了,他还在。所以可以访问,不然你访问个死人。就访问不到了

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
很好理解当内部类定义在局部中时,因为局部中的变量在局部运算完后会被释放,使用final修饰可以与类的使用生命周期相同。
回复 使用道具 举报
又是这个经典问题
回复 使用道具 举报
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,就是说这个变量是常量了,不会再改变了。如果不加上这句话的话,编译会报错。
回复 使用道具 举报
好吧又是这个问题,多看几遍视频就明白了
回复 使用道具 举报
形式上可以看懂看看这个解释:
1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的
2)为什么JAVA中要加上一条限制:只能访问final型的局部变量?
局部变量的生命周期与局部内部类的对象的生命周期的不一致性!
所以要限制为final

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
局部变量会在方法调用完毕后,会在栈内存中立马消失。
而局部内部类中如果有地方使用着局部变量,当方法消失后,
这个方法区中的内容还没有消失,也就是说这个变量还必须存在。
所以,为了延长局部变量的生命周期,就加final修饰了
回复 使用道具 举报
gecl 中级黑马 2015-1-11 13:07:05
10#
下周学到这。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马