黑马程序员技术交流社区

标题: 匿名内部类定义在局部时访问局部变量 [打印本页]

作者: 8047107    时间: 2013-6-6 14:43
标题: 匿名内部类定义在局部时访问局部变量
本帖最后由 8047107 于 2013-6-6 20:20 编辑

abstract class AbsDemo
{
    abstract void show();
}
class Outer
{
        int x = 3;
        /*
        class Inner extends AbsDemo
        {
                int num = 90;                //这里还好理解,内部类在成员位置,
                void show()
                {
                        System.out.println("show :"+num);
                }
                void abc()
                {
                        System.out.println("hehe");
                }
        }
        */

        public void function()
        {
                AbsDemo d = new AbsDemo()
                {
                        int num = 9;        /*关键是这里
                                                  不是说内部类定义在局部变量位置时
                                                   不能访问它所在的局部中的变量吗?
                                                   只能访问被final修饰的局部变量啊
                                                   这里的匿名内部类在局部位置把?
                                                   而且num也是局部变量把?
                                                  怎么能够正常运行呢?
                                                  */
                                                void show()
                                                {
                                                        System.out.println("num==="+num);
                                                }
                                                void abc()
                                                {
                                                        System.out.println("haha");
                                                }
                                };
                                d.show();
        }
}


class InnerClassDemo4
{
        public static void main(String[] args)
        {
                new Outer().function();
        }
}



作者: 孙茜茜    时间: 2013-6-6 15:44
本帖最后由 孙茜茜 于 2013-6-6 15:58 编辑

我也刚看到这课
我觉得是因为num 不是定义在public void function()里
而在这个匿名局部内部类里面
把int num = 9;   拿到上一层花括号,加上final就行了


作者: 风乐    时间: 2013-6-6 16:05
你这个num也定义在了内部类中啊,等于内部类的方法访问此内部类本身的属性,肯定没问题啊。
作者: 8047107    时间: 2013-6-6 17:05
孙茜茜 发表于 2013-6-6 15:44
我也刚看到这课
我觉得是因为num 不是定义在public void function()里
而在这个匿名局部内部类里面

我也觉得是不是把num向上拿一行就不得不加final了
作者: 孔雀东南飞    时间: 2013-6-6 18:11
楼主:
1、 new AbsDemo()
                {
                        //此时num是定义在内部类之中的,对于内部类来说不是局部变量
                        int num = 9;        /*关键是这里
                                                  不是说内部类定义在局部变量位置时
                                                   不能访问它所在的局部中的变量吗?
                                                   只能访问被final修饰的局部变量啊
                                                   这里的匿名内部类在局部位置把?
                                                   而且num也是局部变量把?
                                                  怎么能够正常运行呢?
                                                  */
                                                void show()
                                                {
                                                        System.out.println("num==="+num);
                                                }
                                                void abc()
                                                {
                                                        System.out.println("haha");
                                                }
                                };
2、您所说的情况,匿名内部类访问局部变量必须是final的,是指在function内定义的变量。你可以把 int num= 9;移到function中,就必须加final了。
作者: 8047107    时间: 2013-6-6 20:20
孔雀东南飞 发表于 2013-6-6 18:11
楼主:
1、 new AbsDemo()
                {

x谢谢 了解了!




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