黑马程序员技术交流社区

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

作者: lixiuliang    时间: 2014-2-9 18:37
标题: 关于内部类的问题
  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. }
复制代码

作者: 郭运川    时间: 2014-2-9 19:15
void look(final int num)首先num是look的形参,不是Outter的成员方法,不能通过Outter.num调用,而 new Object()是一个内部类,不能访问成员方法中的变量,但是加上final后 num就可以看做为常量,此时才可以访问num
作者: 倉促、尋找你    时间: 2014-2-9 22:03
因为局部内部类访问局部变量的时候是要加上final的,不然报错。如果访问的是成员变量则是Outer.this.变量名
作者: lixiuliang    时间: 2014-2-9 22:47
楼主最终得到的答案:
内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上。
当内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量。因为编译器会探测局部内部类是否有直接使用外部定义变量的情况,如果有访问,就定义一个同类型变量并在构造方法中用外部变量给自己定义的变量赋值。Sun考虑安全性的问题吧,毕竟复制一份,源数据变化了内部变量不会跟着变化,所以加final修饰不让它改变





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