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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 涐扪①起奮乧 中级黑马   /  2013-10-29 18:01  /  720 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 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()匿名子类对象。但就这个程序,具体的一步一步的执行过程,还请懂得人给讲解一下。万分感激。。。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
main - function - 第一个 new absDemo(){...}.show() - 第二个 new absDemo(){...}.run()
你的问题我不太理解,一个new出来的匿名实例在执行完成之后会自动被JVM当垃圾回收
你这里面就是 function中第一个匿名实例跑完show方法被回收,然后第二个匿名实例跑完run方法被回收,然后主函数里的匿名实例跑完被回收,结束

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
周志龙 + 1 + 3 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 ヅ飞飞 于 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().然后被回收。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”
回复 使用道具 举报
我只是来打酱油 学习的
回复 使用道具 举报
To 金牌黑马 2013-10-30 00:12:20
地板
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
李新辉 来自手机 中级黑马 2013-10-30 09:42:54
7#
ヅ飞飞 发表于 2013-10-29 18:59
是两个对象(因为new了两次)。一个对象调用了show方法另一个调用了run方法。
分析程序流程:
new Out().fu ...

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

不知我说的楼主能否理解,也不知道对不对
大家支出错误。。。
多交流,大家一起进步。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马