黑马程序员技术交流社区

标题: 匿名内部类问题提问。。。 [打印本页]

作者: 涐扪①起奮乧    时间: 2013-10-29 18:01
标题: 匿名内部类问题提问。。。
本帖最后由 杨增坤 于 2013-11-1 15:15 编辑
  1. class Outer
  2. {
  3.         abstract class AbsDemo
  4.         {
  5.                 abstract void show();
  6.         }
  7.         int x = 10;
  8.         /*
  9.         class Inner extends AbsDemo//继承一个外部其他类,如果继承Outer没什么意义,本来就在Outer类中
  10.         {
  11.                 void show()
  12.                 {
  13.                         System.out.println("show:"+x);
  14.                 }
  15.         }
  16.         */
  17.         public void function()
  18.         {
  19.                 //new Inner().show();
  20.                 new AbsDemo()
  21.                 {
  22.                         void show()
  23.                         {
  24.                                 System.out.println("x="+x);
  25.                         }
  26.                         void run()
  27.                         {
  28.                                 System.out.println("hello");
  29.                         }
  30.                 }.show();//只能调用一个方法,不能同时调用.run()和.show()

  31.                
  32.                 new AbsDemo()
  33.                 {
  34.                         void show()
  35.                         {
  36.                                 System.out.println("x="+x);
  37.                         }
  38.                         void run()
  39.                         {
  40.                                 System.out.println("hello");
  41.                         }
  42.                 }.run();
  43.         }
  44. }
  45. class Demo
  46. {
  47.         public static void main(String[] args)
  48.         {
  49.                 new Outer().function();
  50.         }
  51. }
复制代码
我想问的是,这个程序里面调用了show()方法,也调用了run()方法,那么是同一个内部类对象在调用这个两个方法还是有两个对象,一个内部类对象在调用show()方法,另外一个内部类对象在调用run()方法,这方面还是有疑惑。我建立的是一个new Outer()匿名子类对象。但就这个程序,具体的一步一步的执行过程,还请懂得人给讲解一下。万分感激。。。
作者: 零下五度的水    时间: 2013-10-29 18:51
main - function - 第一个 new absDemo(){...}.show() - 第二个 new absDemo(){...}.run()
你的问题我不太理解,一个new出来的匿名实例在执行完成之后会自动被JVM当垃圾回收
你这里面就是 function中第一个匿名实例跑完show方法被回收,然后第二个匿名实例跑完run方法被回收,然后主函数里的匿名实例跑完被回收,结束
作者: ヅ飞飞    时间: 2013-10-29 18:59
本帖最后由 ヅ飞飞 于 2013-10-29 19:01 编辑

是两个对象(因为new了两次)。一个对象调用了show方法另一个调用了run方法。
分析程序流程:
new Out().function();
new了一个Out类的对象,调用了function方法,
循序执行function方法,
先new了一个AbsDemo类的子类对象重写AbsDemo类show方法自己添加新方法run().并调用show方法,调用结束因为没有引用指向该对象所以调用后会被垃圾回收。
(注意:匿名内部类new的是子类对象)
接下来有new了一个AbsDemo子类对象,并调用自己的方法run().然后被回收。

作者: 黄炳期    时间: 2013-10-29 20:34
如果问题已经解决,请及时修改主题为“提问结束”
作者: 带你去看海    时间: 2013-10-29 20:56
我只是来打酱油 学习的
作者: To    时间: 2013-10-30 00:12
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
作者: 李新辉    时间: 2013-10-30 09:42
ヅ飞飞 发表于 2013-10-29 18:59
是两个对象(因为new了两次)。一个对象调用了show方法另一个调用了run方法。
分析程序流程:
new Out().fu ...

应该是先把 AbsDemo()方法 重写之后再建立其子类对象吧....
对象怎么可能先于类存在呢?
这段代码中一个有5个对象....
new Out()初始化的时候建立两个 AbsDemo()的子类匿名对象(两个对象)并分别调用本类对象的show()和fun()。
new out()这个匿名对象(第三个对象)调用 function()时又产生两个 AbsDemo()的匿名对象(一共五个对象),并分别调用本类对象的show()和run()

不知我说的楼主能否理解,也不知道对不对
大家支出错误。。。
多交流,大家一起进步。。。。




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