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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 18353666072 中级黑马   /  2014-6-8 12:58  /  1820 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. interface Inter
  2. {
  3.         public void method();
  4. }

  5. class Test
  6. {

  7.          static Inter function()
  8.          {
  9.                 return new Inter()
  10.                 {
  11.                         public void method()
  12.                         {
  13.                                 System.out.println("oK");
  14.                         }
  15.                  
  16.                 };
  17.         }
  18.        
  19. }
  20. class Test2
  21. {               
  22.                 static class Inner implements Inter
  23.                 {
  24.                         public void method()
  25.                         {
  26.                                 System.out.println("ok !!!");
  27.                         }
  28.                 }
  29.                 static  Inter function()
  30.                 {
  31.                         return new Inner();
  32.                 }


  33. }
  34. class neibulei
  35. {
  36.         public static void main(String[] a){
  37.                 Test2.function().method();
  38.                
  39.        
  40.         }
  41. }
复制代码

Test2.function().method();   这句话我咋看不懂呢,,,,,,,,,,,,,,,,,,,请大神解释解释{:3_62:}
还有为什么匿名内部类要么实现接口,要么继承呢,,,,,,,,,,,,,,,,,,也请大神解释解释{:3_62:}
谢谢------:handshake:(

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 执笔梦 于 2014-6-8 13:17 编辑

Test2.function().method();
如:
  Inter inner = Test2.function();
  inner.method();
.Test2.function();属于类名直接调用静态方法,而这个方法返一个实现接口的内部类对象,
   再用这个对象调用属于它的方法method();


评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
Test2.function().method()相当于
  1. Inter inter=Test2.function();
  2.                 inter.method();
复制代码



楼主的第二个问题,我理解的是,不是因为要写一个匿名内部类所以要实现接口或者继承。就像你的例子一样,一般你要返回一个实现了某个接口的对象时,为了简写该方法才用到了匿名内部类。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
Test2.function().method();分析:
首先:Test2.function()即通过类名Test2直接调用function()方法,说明该方法为静态,
其次:Test2.function().method();调用完function()方法后能再调用method()方法,说明该方法返回一个对象
又因为method()是内部类中的一个方法,对内部类成员的访问需要建立内部类的对象,所以function()返回的是内部类Inner的实例对象

匿名内部类要么实现接口要么继承的原因:
因为内部类没有名字,所以要创建该类只能使用多态:父类引用指向子类对象
所以:  new 父类或者接口(){定义子类的内容}
对于实现的接口需要对接口里的方法进行实现
对于继承的父类,因为是父类引用指向子类实例对象,所以不能调用子类的特有方法
如有缺漏,还请大家指教~~!

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
Test2.function()方法返回的是一个Inter接口对象 相当于多态  new Inter=new Test2.Inner() 因为接口不能实例所以不能直接调用接口的抽象方法(就算能调用也意义) 得有个类去实现该接口并去重写抽象方法 Test2中的内部类Inner实现了Inter接口 并重写了Method方法    .method()相当于调用内部类new Test2.Inner().method() 所以就调用的是实现类的方法结果   第二个问题不知怎么说
回复 使用道具 举报
表示同问,很久没接触内部类了,都忘了啊!
回复 使用道具 举报
本帖最后由 西门吹风 于 2014-6-8 17:23 编辑

Test2.fnuction():返回一个内部类实例对象
Test2.function().method():这个内部类实例对象调内部类中的method方法
第二个问题,想想如果一个匿名内部类既没有继承类,也没有实现接口,而且还没有名字,那么要怎样创建它的实例对象呢?好像不行吧,如果继承一个类或实现一个接口,即使这个匿名类没有名字,也可以利用多态的特性,通父类或接口的引用来创建子类实例对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马