黑马程序员技术交流社区

标题: 关于局部内部类的问题 [打印本页]

作者: 唐巍    时间: 2012-3-7 02:29
标题: 关于局部内部类的问题
请看下面代码:
class Outer
{
        int x=6;
        void method(final int a)
        {
                final int y=8;
                class Inner
                {
                        void function()
                        {
                                System.out.println("inner:"+x);//这里x未被final修饰,内部类Inner为什么能直接访问?
                                System.out.println("inner:"+y);
                                System.out.println("inner:"+a);
                        }
                }
                new Inner().function();
        }
}
       

class InnerClassDemo
{
        public static void main(String[] args)
        {
                Outer out=new Outer();
                out.method(9);
                out.method(21);//变量a被final修饰,这里为什么可以重新赋值为21?
        }
}
作者: 张锐    时间: 2012-3-7 08:15
1.因为method和x平级都在外部类中,所以method可以访问x,而内部类属于method,所以可以访问x。
2.final修饰函数的形参a表示a不可以在函数内部被修改,在外面当然可以修改了,你在method内部对a进行修改肯定就不行了。ps:如果用final修饰函数的返回值,则表示只可以在这个函数内部被修改,其他地方不能被修改。
作者: 王杰    时间: 2012-3-7 08:45
1.System.out.println("inner:"+x);//这里x未被final修饰,内部类Inner为什么能直接访问?
因为x省略了对外部类的引用。完整写出来应该说是这样:Outer.this.x

2,out.method(21);//变量a被final修饰,这里为什么可以重新赋值为21?
参数被final修饰,说明他只能被赋值一次!你的意思是为什么第一次赋值为9,为什么还能赋值为21吧。
这个是因为第一次你调用method方法,在方法执行结束以后,就出栈了。所以第二次很可以赋值。其实并不是你认为的重新赋值。第二个method方法,并不是第一个,他们在内存中的地址是不同的。
作者: 王亚男    时间: 2012-3-7 08:59
第一个问题楼上说的很清楚了。
第二个问题,被finnal修饰了只是它在这个方法体中值不可被改变,但它也只是个局部变量,这个方法结束后,还是会被释放的。
你第一次调用并执行完method方法后,a的值就已经被释放了。
声明成final唯一的区别就是,你不能在方法体中再对它进行赋值运算了,如a++,因为在方法体中,它已经是一个常量了。
执行完方法体,它就不存在了,而是在你再次调用时才会出现。
作者: dangfei    时间: 2012-3-7 09:01
变量都有作用范围,out.method(9);执行完时这个a就被java虚拟机认为超出作用范围,当做垃圾回收。
因此到out.method(21)时的a,是又一个变量。也就是说,两次调用的a不是同一个。
作者: 泮和顺    时间: 2012-3-7 09:04
说的真详细 学习了!




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