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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始



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

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

11 个回复

倒序浏览
num是内部类AbsDemo的非静态成员变量,所以它里面的非静态方法当然能够调用啦。
回复 使用道具 举报
本帖最后由 张然龙 于 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的值。


评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报 1 0
因为没有看到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()这个成员函数造成的。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
挺好的。加油
回复 使用道具 举报
本帖最后由 段兆洋 于 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 11:20 编辑
张然龙 发表于 2014-4-29 22:45
匿名内部类的作用就是一次调用就会被回收,因为new的对象没有名字,所以没有指向内存地址的变量接收他,出 ...

奥 我没把代码不全 呵呵 我先把代码补全
我还有个其他问题:
http://bbs.itheima.com/thread-116277-1-1.html
回复 使用道具 举报
张然龙 发表于 2014-4-29 22:45
匿名内部类的作用就是一次调用就会被回收,因为new的对象没有名字,所以没有指向内存地址的变量接收他,出 ...

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

赞同......
回复 使用道具 举报 1 0
看过了,不错
回复 使用道具 举报
学习了,还没看到匿名调用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马