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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 8047107 高级黑马   /  2013-6-6 14:43  /  2076 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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();
        }
}


评分

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

查看全部评分

5 个回复

倒序浏览
本帖最后由 孙茜茜 于 2013-6-6 15:58 编辑

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

评分

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

查看全部评分

回复 使用道具 举报
你这个num也定义在了内部类中啊,等于内部类的方法访问此内部类本身的属性,肯定没问题啊。
回复 使用道具 举报
孙茜茜 发表于 2013-6-6 15:44
我也刚看到这课
我觉得是因为num 不是定义在public void function()里
而在这个匿名局部内部类里面

我也觉得是不是把num向上拿一行就不得不加final了
回复 使用道具 举报
楼主:
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了。

评分

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

查看全部评分

回复 使用道具 举报
孔雀东南飞 发表于 2013-6-6 18:11
楼主:
1、 new AbsDemo()
                {

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