黑马程序员技术交流社区

标题: 匿名内部类练习的一个问题、 [打印本页]

作者: 李阳阳    时间: 2013-3-18 13:42
标题: 匿名内部类练习的一个问题、
本帖最后由 李阳阳 于 2013-3-18 19:58 编辑
  1. interface Inter
  2. {
  3.         abstract void method();
  4. }
  5. class Test
  6. {
  7.         //补足代码,通过匿名内部类
  8.         static class inner implements Inter
  9.         {
  10.                 public  void method()
  11.                 {
  12.                         System.out.println("method run");
  13.                 }
  14.         }
  15.         static inner fuction()
  16.         {
  17.                 return new inner();//这样不是也行吗?
  18.         }
  19. }
  20. class InnerClassTest
  21. {
  22.         public static void main(String[] args)
  23.                 {
  24.                         //Test.function():Test类中有一个静态的方法function。
  25.                 //.method():function这个方法运算后的结果是一个对象。而且是一个Inter类型的对象。
  26.                 //因为只有是Inter类型的对象,才可以调用method方法。

  27.                                 Test.fuction().method();   
  28.         }
  29. }
复制代码
主函数内注释部分前两个我知道,但是Test.fuction()运算之后为什么只有Inter类型的对象才能调用method方法呢,Inter不是一个接口不能创建对象吗?所以调用method方法的应该是一个实现接口的类,这里也就是内部类Inner,所以Test.fuction()之后不是应该返回的是一个内部类对象吗?不知道是那个点儿转不回来了,大家给讲讲、
作者: fighting    时间: 2013-3-18 14:51
你讲的已经很正确了啊,接口当然是不能创建对象了。
可以看到编译产生的class文件有4个,其中包括一个接口,
当Test.fuction()之后返回的是Test$inner.class,
是一个类,不是接口,只不过这个类中实现了接口中的方法,那么,
当调用method方法时,自然是去执行打印的那句话了。

无标题.png (2.55 KB, 下载次数: 36)

无标题.png

作者: 李阳阳    时间: 2013-3-18 17:22
fighting 发表于 2013-3-18 14:51
你讲的已经很正确了啊,接口当然是不能创建对象了。
可以看到编译产生的class文件有4个,其中包括一个接口 ...

“因为只有是Inter类型的对象,才可以调用method方法。”其实就这句不明白、、
作者: fighting    时间: 2013-3-18 22:37
李阳阳 发表于 2013-3-18 17:22
“因为只有是Inter类型的对象,才可以调用method方法。”其实就这句不明白、、 ...

这句话说的不太准确吧,应该说,只要是Inter类型的对象就可以调用method方法




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