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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐巍 黑马帝   /  2012-3-7 02:29  /  1591 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请看下面代码:
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?
        }
}

5 个回复

倒序浏览
1.因为method和x平级都在外部类中,所以method可以访问x,而内部类属于method,所以可以访问x。
2.final修饰函数的形参a表示a不可以在函数内部被修改,在外面当然可以修改了,你在method内部对a进行修改肯定就不行了。ps:如果用final修饰函数的返回值,则表示只可以在这个函数内部被修改,其他地方不能被修改。
回复 使用道具 举报
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方法,并不是第一个,他们在内存中的地址是不同的。
回复 使用道具 举报
第一个问题楼上说的很清楚了。
第二个问题,被finnal修饰了只是它在这个方法体中值不可被改变,但它也只是个局部变量,这个方法结束后,还是会被释放的。
你第一次调用并执行完method方法后,a的值就已经被释放了。
声明成final唯一的区别就是,你不能在方法体中再对它进行赋值运算了,如a++,因为在方法体中,它已经是一个常量了。
执行完方法体,它就不存在了,而是在你再次调用时才会出现。
回复 使用道具 举报
变量都有作用范围,out.method(9);执行完时这个a就被java虚拟机认为超出作用范围,当做垃圾回收。
因此到out.method(21)时的a,是又一个变量。也就是说,两次调用的a不是同一个。
回复 使用道具 举报
说的真详细 学习了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马