黑马程序员技术交流社区

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

作者: 王--明    时间: 2012-2-26 20:17
标题: 内部类的问题
内部类访问局部变量为什么要定义成final类型。求详解。
作者: 唐学松    时间: 2012-2-26 20:34
因为局部变量是临时的,方法一旦执行完毕即被释放,而内部类是要在java虚拟机中动态运行的程序,它的生命周期不随方法的结束而结束,故而。。。
如下:
class   A
{
int i = 3;
public   void   shout()
{

class   B
{
public   void   shout1()
{
System.out.println(i);
}

}
B   b=new   B();
b.shout1();
}

public   static   void   main(String   []   args)
{
A   a=new   A();
a.shout();
}
}
可正常输出3,证明可以访问类的变量i,但改为下面的方式:
class   A
{
public   void   shout(int temp)
{
final int i = temp;
class   B
{
public   void   shout1()
{
System.out.println(i);
}

}
B   b=new   B();
b.shout1();
}

public   static   void   main(String   []   args)
{
A   a=new   A();
a.shout(3);
}
}

如不是final变量, 当i发生变化, 类B实例不能找到新i变量的地址, 便会出现了歧义. 如不希望final, 可讲i定义为A的类成员变量
作者: 朱皓    时间: 2012-2-26 22:07
是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用
作者: tanlei200620    时间: 2012-2-27 11:16
通过网上文章学习得知,大抵解释如下:
      你说的内部类应该是局部内部类,它定义在外部类的成员方法中。
      在局部内部类中访问的  局部变量的值 ,其实是它在这个局部内部类中 临时定义的一个变量, 用 反射可以证明,(以后你会学到)。原因是因为局部变量使用了立即被释放,局部内部类直接访问可能访问不到。
      但是有一个问题就是这个临时变量 被赋给的是值,不是 对局部变量的引用,意味着不能随着局部变量的更改而相应的变动,那么如果你不把局部变量修饰为 final 类型,你使用完局部变量后给它重新赋值,就会出现局部内部类使用的变量值不是你所预期的,故将其定义为final ,顺应人们的逻辑。

不是很好理解,看详细附的文章。
作者: tanlei200620    时间: 2012-2-27 11:18
细附的文章为这个压缩包。

为什么从内部类中访问局部变量需要被声明为最终类型.rar

4.39 KB, 下载次数: 76






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