黑马程序员技术交流社区

标题: 有关一个匿名内部类的问题 [打印本页]

作者: wdtdcm    时间: 2014-2-27 10:44
标题: 有关一个匿名内部类的问题
  1. class Outer{
  2.         int x=3;
  3.         /*
  4.         class Inner extends Abs{
  5.                 void show(){
  6.                         System.out.println(x);
  7.                 }
  8.         }
  9.         */

  10.         public void function(){
  11.                 //new Inner().show();
  12.                 //int x=9;//为什么定义这里时要加final修饰.
  13.                 new Abs(){
  14.                         int x=9;//为什么定义在这里可以呢?
  15.                         void show(){
  16.                                 System.out.println(x);
  17.                         }
  18.                 }.show();
  19.         }
  20. }

  21. abstract class Abs{
  22.         abstract void show();
  23. }

  24. class NiNei2{
  25.         public static void main(String[] args){
  26.                 new Outer().function();
  27.         }
  28. }
复制代码



作者: 谭荣强    时间: 2014-2-27 11:25
不知道你的问题是不是注释的那部分。
1.//int x=9;//为什么定义这里时要加final修饰.     将x=9定义final,表示x在function()中是一个固定不变的常量9,至于为什么要用final修饰,应该是毕老师要演示内部类的一些调用规则。

2.int x=9;//为什么定义在这里可以呢?   new Abs(){
                        int x=9;
                        void show(){
                                System.out.println(x);
                        }
                }.show();  是一个匿名内部类,里面当然可以定义自己变量x啊,只不过作用域不同
作者: 乔青山    时间: 2014-2-27 12:47
本帖最后由 乔青山 于 2014-2-27 12:58 编辑

这个是生命周期的原因,有好多同学问过这个问题(其实你可以直接查阅一下):
定义在方法中时,运行这个方法会出现这种情况:
1.方法的局部内部类的一个对象在运行。
2.方法同时也在运行。
那这个时候是没问题的,但是:
当方法运行完毕后,方法中的局部变量会出栈,也就是说内存中没有这个变量了。
这个时候局部内部来还是在运行,而且还调用了方法中的变量,但是这个变量已经出栈了,所以就错误了。

而声明为final呢,这个局部变量会变为常量,存在于常量池中(你可以把他理解为方法中的静态属性)。
那这个局部变量就不会因为方法的结束而在内存中消失了,局部内部类才可以调用他。
作者: 乔青山    时间: 2014-2-27 12:50
至于你说
int x=9;//为什么定义在这里可以呢?
这句就是定义在内部类中的变量,跟平时写的成员变量差不多。
换句话说,你写在内部类里就属于内部类了,不属于外部方法了(当然方法可以调用他)。




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