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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© て淡莣了陌生 中级黑马   /  2013-5-4 23:24  /  1508 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内不类访问外部成员时外部属性为什么要加final, 不加可以吗

3 个回复

倒序浏览
本帖最后由 wodeairenw 于 2013-5-5 01:38 编辑

访问局部变量的时候要加final吧,因为局部变量是在栈内存里,如果内部类建立了对象会在堆内存里,所以如果局部变量不加final的话会使的访问的时候,局部变量已经释放了。
回复 使用道具 举报
1.匿名内部类肯定是局部内部类(在一个方法里面定义的内部类),因为在java中,语句必须写在方法里,而匿名内部类其实就是一条特殊的语句;
2.外部给定的对象就是所有外来的对象:外部方法的形参、局部变量、基本类型或自定义类型等。
3.内部类很微妙,它可以直接访问外部类的private field,这打破了类的封装。但是内部类又有它自身的好处,比如简洁,可见性等,于是就把它定位成“只读”,也就是final。不过这个保护也非常脆弱!
4.local inner class访问local var时,那个var必须是final的。因为可以通过enclosing class访问那个local var,也可以通过inner class访问,可能造成问题,所以就必须是final的
5.匿名内部类为什么只能用final.是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。

回复 使用道具 举报
为什么要加fina?l
这是局部变量的生命周期与局部内部类的对象的生命周期的不一致性决定的。
可以反过来理解,如果不加final会怎么样?
假设方法m()被调用,在它的调用栈中产生了变量x,这时有个内部类对象InnerClass访问这个x,可是x已经随着方法M()结束而被释放了,
那么内部类就会访问一个不存在变量,这是不允许的。
所以必须加final,当局部变量有了final看似的延长了周期(其实是复制了一份)。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马