黑马程序员技术交流社区

标题: 求教啊!兄弟姐妹们,匿名内部类的局部变量问题! [打印本页]

作者: 段兆洋    时间: 2014-4-29 22:20
标题: 求教啊!兄弟姐妹们,匿名内部类的局部变量问题!


AbsDemo d = new AbsDemo()
{
        int num = 9;
        void show()
        {
                System.out.println("num==="+num);
        }
        void abc()
        {
                System.out.println("haha");
        }
};

d.show();
//d.abc();//编译失败;
以上代码 , 为什么调用局部变量,怎么可以呢?

作者: 神马    时间: 2014-4-29 22:29
num是内部类AbsDemo的非静态成员变量,所以它里面的非静态方法当然能够调用啦。
作者: 张然龙    时间: 2014-4-29 22:45
本帖最后由 张然龙 于 2014-4-29 22:56 编辑

匿名内部类的作用就是一次调用就会被回收,因为new的对象没有名字,所以没有指向内存地址的变量接收他,出了代码块就会jvm视为垃圾,等待回收。就算用多态的形式去调用也不能指定子类的名字,而且多态的变量访问规则一般都是看左边的,只有覆盖的方法才能用多态去调用子类的,所以你当前的代码无法在外部调用你内部类中的变量num,而你的show方法是定义在内部类中的,所以可以访问到。
如果楼主想在外部调用num变量,我帮你改下代码 ↓

  1. class Demo
  2. {
  3.         public void demo()
  4.         {
  5.                 AbsDemo d = new AbsDemo()
  6.                 {
  7.                         int num = 9;
  8.                         public void show()
  9.                         {
  10.                                 System.out.println("num==="+num);
  11.                                 abc();
  12.                         }
  13.                         public int abc()
  14.                         {
  15.                                 return num;
  16.                         }
  17.                 };
  18.                 int num=d.abc();
  19.                 System.out.println(num);
  20.         }
  21. }
  22. class Demo2
  23. {
  24.         public static void main(String args[])
  25.         {        
  26.                 new Demo().demo();
  27.         }
  28. }
复制代码


在接口中定义个abc方法 ,在外部就可以利用多态来调用abc方法返回num的值。



作者: 爱翚    时间: 2014-4-29 23:16
因为没有看到AbsDemo这个类所以不知道AbsDemo类中的具体实现。
但是当我补上AbsDemo这个类代码后是没有问题的,代码如下:
abstract class AbsDemo {
        abstract void show();

        abstract void abc();
}

public class Text111 {
        public static void main(String[] args) {
                AbsDemo d = new AbsDemo() {
                        int num = 9;

                        void show() {
                                System.out.println("num===" + num);
                        }

                        void abc() {
                                System.out.println("haha");
                        }
                };
               
                d.show();
                d.abc();
        }
}

分析原因:可能是你写的AbsDemo类中没有定义abc()这个成员函数造成的。
作者: 小流氓123    时间: 2014-4-29 23:32
挺好的。加油
作者: 段兆洋    时间: 2014-4-30 10:52
本帖最后由 段兆洋 于 2014-4-30 11:21 编辑
爱翚 发表于 2014-4-29 23:16
因为没有看到AbsDemo这个类所以不知道AbsDemo类中的具体实现。
但是当我补上AbsDemo这个类代码后是没有问题 ...

额,我没把代码写全,不好意思,不过你这样就完全避免我的问题了!:lol我先把代码补全

我还有个其他问题 ,帮忙看下:
http://bbs.itheima.com/thread-116277-1-1.html

作者: 段兆洋    时间: 2014-4-30 10:53
本帖最后由 段兆洋 于 2014-4-30 11:20 编辑
张然龙 发表于 2014-4-29 22:45
匿名内部类的作用就是一次调用就会被回收,因为new的对象没有名字,所以没有指向内存地址的变量接收他,出 ...

奥 我没把代码不全 呵呵 我先把代码补全
我还有个其他问题:
http://bbs.itheima.com/thread-116277-1-1.html

作者: 段兆洋    时间: 2014-4-30 11:09
张然龙 发表于 2014-4-29 22:45
匿名内部类的作用就是一次调用就会被回收,因为new的对象没有名字,所以没有指向内存地址的变量接收他,出 ...

哦哦 ,我理解了 哈哈,之前对匿名内部类理解不透彻,原来 num是作为局部变量直接用完收回的  谢谢~
作者: yinxjfly    时间: 2014-5-24 01:07
看着又迷糊了!边学边忘,受不鸟!
作者: 唤月    时间: 2014-5-24 18:45
爱翚 发表于 2014-4-29 23:16
因为没有看到AbsDemo这个类所以不知道AbsDemo类中的具体实现。
但是当我补上AbsDemo这个类代码后是没有问题 ...

赞同......
作者: cain    时间: 2014-6-5 21:11
看过了,不错
作者: ss5619498    时间: 2014-7-8 21:11
学习了,还没看到匿名调用




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