本帖最后由 高原 于 2012-7-9 11:04 编辑
- 这个问题我想了很久,想到了一种解释方法,你看看怎么样
- 首先我把代码修改一下,注意我修改时候的代码是不对的,为什么不对,我会解释
- class Outer
- {
- int x=3;
- void method()
- {
- int y=4; //注意这里我把final去掉了
- class Inner//内部类处于局部中。不能被成员修饰符修饰
- {
- void function()
- {
- System.out.println(y); //局部内部类访问了非final修饰的局部变量,这样是不对的,为什么,我下面解释
- }
- }
- y = 5; //由于y不是final,这样写没有错
- new Inner().function(); //你的代码里这里没有new Inner的对象,所以你的程序是没有打印结果的,这里不要忘了
- y = 6; //注意了这里就是关键所在,如果内部类访问了一个非final的局部变量,既然是非final,它的值就可以随时改变,那么问题就来了,
- //这里的局部变量 y 有三个值,请问new Inner().function();,这个Inner对象到底访问的是哪一个 y 呢?这个连虚拟机自己都搞不清了
- //如果你非要说访问的是 y = 5,那么访问之后y的值又变成 y = 6 了,那么这个Inner去访问一个一直改变的值又有什么意义呢?
- //所以局部内部类访问局部变量时,此局部变量必须由final修饰
- //以上是我的理解,欢迎大家指正和补充
- }
- }
- class InnerDemo4
- {
- public static void main(String [] args)
- {
- new Outer().method();
- }
- }
|