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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lixiuliang 中级黑马   /  2014-2-9 18:37  /  1261 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Outter{
  2.         void look(final int num){        //为什么这里要加final,下面的num才能访问到?
  3.                 new Object(){
  4.                         void show(){
  5.                                 System.out.println(num);
  6.                         }
  7.                 }.show();
  8.         }
  9. }

  10. class MyClass {
  11.         public static void main(String[] args) {
  12.                 new Outter().look(9);
  13.         }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

3 个回复

倒序浏览
void look(final int num)首先num是look的形参,不是Outter的成员方法,不能通过Outter.num调用,而 new Object()是一个内部类,不能访问成员方法中的变量,但是加上final后 num就可以看做为常量,此时才可以访问num

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
因为局部内部类访问局部变量的时候是要加上final的,不然报错。如果访问的是成员变量则是Outer.this.变量名

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
楼主最终得到的答案:
内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上。
当内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量。因为编译器会探测局部内部类是否有直接使用外部定义变量的情况,如果有访问,就定义一个同类型变量并在构造方法中用外部变量给自己定义的变量赋值。Sun考虑安全性的问题吧,毕竟复制一份,源数据变化了内部变量不会跟着变化,所以加final修饰不让它改变

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马