CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

100分 关于接口的问题?

楼主tartar(tartar)2003-11-01 13:40:40 在 Java / J2SE / 基础类 提问

在接口中有的空的方法中带有参数,比如  
      interface   A{  
              public   boolean   play(String   i);  
              。。。。。  
            }  
  在类B实现了接口A,比如  
      class   B   implements   A{  
              public   boolean   play(String   i)  
                        {   具体的处理,用到了   i,  
                                代码略  
                                }  
              ......  
            }  
  而在其他类中真正用到B类中实现的play(String   i)方法时往往只需写个   new   B();而没有对play(String   i)中的i给予任何东西。那么这个i在接口中到底有个什么作用呢?  
  那位能够解释的详细一点? 问题点数:100、回复次数:20Top

1 楼ayayanvren(前天)回复于 2003-11-01 13:52:04 得分 0

B是实现A接口的类,new   B()   构造了一个B的实例。  
  我感觉应该在其他地方调用时应该:  
  ...String   str   a="";  
  Top

2 楼ayayanvren(前天)回复于 2003-11-01 13:55:50 得分 0

//上面操作失误。sorry  
  ...String   stra="";  
        B   clsB=new   B();  
  stra=clsB.play("zenmele");  
  //有代码可以贴上来吗?Top

3 楼ayayanvren(前天)回复于 2003-11-01 14:23:43 得分 0

public   interface   A   {  
      public   boolean   play(String   i);  
  }  
  /////////////////////  
  public   class   B   implements   interA{  
   
      public   B()   {  
      }  
      public   boolean   play(String   i){  
          if   (i.length()>2)  
              return   true;  
          else  
              return   false;  
      }  
  }  
  ////////////////////  
  public   class   clsA   {  
      public   clsA()   {  
      }  
      public   static   void   main(String[]   args){  
          String   strA="asdlfkafs";  
          AB   Abinst=new   AB();  
          boolean   blnA=Abinst.play(strA);  
          if(blnA==true)  
              System.out.println("OK!");  
      }  
  }  
  //搂住对不起,回了两个废帖子  
  我看了几遍你的问题,我把其他类中的调用形式写上来了,你说的不是这种情况吗?  
   
  我理解你的意思是说  
  boolean   blnA=new   AB();  
  这不可能啊!Top

4 楼flyspider(飞天蜘蛛)回复于 2003-11-01 15:28:54 得分 0

呵呵,这个i除了表明该方法接受一个字符串变量作为参数外,不起啥作用。  
  楼住应该是在一般的基础语法教科书上看到的该例子吧?这些书中的例子除了说明问题外,一般并不一定有什么实际的意义,不必深究。Top

5 楼tartar(tartar)回复于 2003-11-01 15:35:06 得分 0

回:ayayanvren(狂狮)    
  你没理解我的意思   boolean   blnA=new   AB();   这当然是不可能的!  
  我问的重点并不是实例化的问题~不实例化当然不行!我是想知道在实例化了B之后,  
      B   bb=new   B();为什么不用写bb.play(参数)而play就能自动执行,而却此时也就更谈不上为play方法中的参数赋值了?  
     
  Top

6 楼sundaydreamer(盲盲)回复于 2003-11-01 16:01:19 得分 0

没有调用怎么可能执行?嗬嗬,代码中当然会用调用play的地方,你可以看看B的构造器里面是否调用了play方法Top

7 楼yaray(雅睿,生活在别处)回复于 2003-11-01 16:26:31 得分 0

那你看看这个play(..)方法是在哪调用的啊,按照楼主的意思,好象应该是在B类的构造方法中调用的吧?Top

8 楼tartar(tartar)回复于 2003-11-02 16:54:56 得分 0

回:sundaydreamer(盲盲)     yaray(雅睿,生活在别处)    
          在B类的构造函数中并没有调用play(参数)!!!    
  我贴一段程序,大家看看~~~~~~~  
              这个程序是应用FilterReader接口从一个文件中过滤出HTML标签,也就是过滤文件中<...>   尖括号之间的内容。  
        import   java.io.*;  
   
  /**  
    *   A   simple   FilterReader   that   strips   HTML   tags   (or   anything   between  
    *   pairs   of   angle   brackets)   out   of   a   stream   of   characters.  
    **/  
  public   class   RemoveHTMLReader   extends   FilterReader   {  
          /**   A   trivial   constructor.     Just   initialize   our   superclass   */  
          public   RemoveHTMLReader(Reader   in)   {   super(in);   }  
           
          boolean   intag   =   false;         //   Used   to   remember   whether   we   are   "inside"   a   tag  
   
          /**    
            *   This   is   the   implementation   of   the   no-op   read()   method   of   FilterReader.  
            *   It   calls   in.read()   to   get   a   buffer   full   of   characters,   then   strips  
            *   out   the   HTML   tags.     (in   is   a   protected   field   of   the   superclass).  
            **/  
          public   int   read(char[]   buf,   int   from,   int   len)   throws   IOException   {  
                  int   numchars   =   0;                 //   how   many   characters   have   been   read  
                  //   Loop,   because   we   might   read   a   bunch   of   characters,   then   strip   them  
                  //   all   out,   leaving   us   with   zero   characters   to   return.  
                  while   (numchars   ==   0)   {  
                          numchars   =   in.read(buf,   from,   len);   //   Read   characters  
                          if   (numchars   ==   -1)   return   -1;             //   Check   for   EOF   and   handle   it.  
   
                          //   Loop   through   the   characters   we   read,   stripping   out   HTML   tags.  
                          //   Characters   not   in   tags   are   copied   over   previous   tags    
                          int   last   =   from;                                         //   Index   of   last   non-HTML   char  
                          for(int   i   =   from;   i   <   from   +   numchars;   i++)   {    
                                  if   (!intag)   {                                             //   If   not   in   an   HTML   tag  
                                          if   (buf[i]   ==   '<')   intag   =   true;   //   check   for   tag   start  
                                          else   buf[last++]   =   buf[i];               //   and   copy   the   character  
                                  }  
                                  else   if   (buf[i]   ==   '>')   intag   =   false;     //   check   for   end   of   tag  
                          }  
                          numchars   =   last   -   from;   //   Figure   out   how   many   characters   remain  
                  }                                                       //   And   if   it   is   more   than   zero   characters  
                  return   numchars;                         //   Then   return   that   number.  
          }    
           
          /**    
            *   This   is   another   no-op   read()   method   we   have   to   implement.     We    
            *   implement   it   in   terms   of   the   method   above.     Our   superclass   implements  
            *   the   remaining   read()   methods   in   terms   of   these   two.  
            **/  
          public   int   read()   throws   IOException   {    
                  char[]   buf   =   new   char[1];  
                  int   result   =   read(buf,   0,   1);  
                  if   (result   ==   -1)   return   -1;  
                  else   return   (int)buf[0];  
          }  
           
          /**   This   class   defines   a   main()   method   to   test   the   RemoveHTMLReader   */  
          public   static   class   Test   {  
                  /**   The   test   program:   read   a   text   file,   strip   HTML,   print   to   console   */  
                  public   static   void   main(String[]   args)   {  
                          try   {  
                                  if   (args.length   !=   1)    
                                          throw   new   IllegalArgumentException("Wrong   number   of   args");  
                                  //   Create   a   stream   to   read   from   the   file   and   strip   tags   from   it  
                                  BufferedReader   in   =   new   BufferedReader(  
            new   RemoveHTMLReader(new   FileReader(args[0])));  
                                  //   Read   line   by   line,   printing   lines   to   the   console  
                                  String   line;  
                                  while((line   =   in.readLine())   !=   null)  
                                          System.out.println(line);  
                                  in.close();     //   Close   the   stream.  
                          }  
                          catch(Exception   e)   {  
                                  System.err.println(e);  
                                  System.err.println("Usage:   java   RemoveHTMLReader$Test"   +  
        "   <filename>");  
                          }  
                  }  
          }  
  }  
  Top

9 楼noratong(吴雨)回复于 2003-11-02 17:24:58 得分 90

楼主说的好像事件的接口,我觉得在你看来只是构造了一个对象却没有调用它相应的方法,更没有给这个方法传参数,这就跟我们用的实现了事件接口的适配器不一样的现象吗。  
   
  至于为什么会,这样楼主也应该想到,我们没有显示调用的方法并不代表它就不会被调用,而只是没有被我们显示调用,而是被系统调用了,系统在调用的同时也会传给这个方法需要的参数,事件的原理就是最好的解释。我想你贴出来的代码,也无非是这个原理。  
   
  对于那些我们自己写的接口,实现了,但实例化后没有去调用它的方法,那么它的方法是决不会被调用的,更不谈传入参数了。所以是依据情况而定的。Top

10 楼tartar(tartar)回复于 2003-11-02 18:34:18 得分 0

回:noratong(诺拉)    
        你的事件接口的解释让我明白了一点,既然是系统调用并有系统传递给方法需要的参数,那么这个系统是如何知道他所需要传递的参数的具体值的呢?就好像上面的read()方法,个人理解第一个read(char[]   buf,int   from,int   len)方法在这段代码中from应该表示的是文件的起始点,而len应该表示的是从起始点读取的长度,在main函数中大家看到对实现了过滤功能的RmoveHTMLReader类的实例化是包含在                                 BufferedReader   in   =   new   BufferedReader(  
            new   RemoveHTMLReader(new   FileReader(args[0])));  
  这个语句里面的,后面并没有显示的调用方法read(.....)方法,那么在系统隐式调用read(...)方法的同时系统还应该传递给这个方法需要的参数from,len。那么系统是如何知道需要传递的值的呢?Top

11 楼tartar(tartar)回复于 2003-11-02 18:49:50 得分 0

还有一点~这个RemoveHTMLReader类实现了两个read方法,其中第2个read()并没有带任何参数而在这个read()方法中又调用了第一个read(char   buf[],int   from,int   len)。  
         
          public   int   read()   throws   IOException   {    
                  char[]   buf   =   new   char[1];  
                  int   result   =   read(buf,   0,   1);  
                  if   (result   ==   -1)   return   -1;  
                  else   return   (int)buf[0];  
          }  
  这第2个read()方法也许是个突破口,上面的那一大段程序要完成从头到尾过滤的功能就得从0(from)开始过滤,过滤的长度就应该是整个文件的长度(len)。但我还是不知道系统是如何知道要传递给参数的具体值的??在这个例子中也就是说系统如何知道该把0和要过滤的长度传递给from   和len???Top

12 楼noratong(吴雨)回复于 2003-11-02 18:54:40 得分 0

对不起,刚才我没仔细看你的代码,你的代码跟我所说的事件的原理还不是一回事,但事件的原理正如我所说的那样,只要你用过事件,那么应该很清楚我所说的。  
   
  但现在就你所贴出的代码来看,RemoveHTMLReader类的read的方法并不是没有被调用,它是通过其它方法来调用的,具体在那个方法里调用,我还不是很清楚,要文档。因为它一个readLine方法可能调用了几层关系。至于你说的没有给read方法传入from和len参数,那是因为没有调用那个read方法,而是调用的无参的read方法,你应该看见这个类有两个read方法吧。所以系统也无需知道传递的值。  
  这些好像都是些基本原理,你应该多看一下书。有什么不对,才讨论。Top

13 楼tartar(tartar)回复于 2003-11-02 20:08:52 得分 0

回:noratong(诺拉)    
        关于这些基本原理的应该看看那本书?我看了一些介绍基本原理的都没有讲到我所需要的内容~  
  怎么使用文档搞清楚这些调用关系?麻烦介绍一下!!Top

14 楼wxh512(狮子)回复于 2003-11-03 18:00:56 得分 0

爱我在这一点上也很迷糊  
  而且当无了好多时间了还是没有搞懂  
  谢谢大侠们指导Top

15 楼Hodex(小何才露尖尖角)回复于 2003-11-03 19:08:38 得分 0

总有地方用的^^  
  Top

16 楼bobqi(灰冷)回复于 2003-11-03 20:50:41 得分 0

由于你的实例化类是RemoveHTMLReader  
  他是继承FilterReader这个父类的,对于你的迷惑我只能推测出  
  read函数是作为FilterReader的接口实现  
  而在进行   super(in)构造时,read函数被调用Top

17 楼bobqi(灰冷)回复于 2003-11-03 20:52:03 得分 0

我个人猜想也就是  
  interface   a   {  
      //构造  
      a()   {  
      }  
      a(   String   str)   {  
            play(   str   );  
        }  
   
  public   boolean   play(String   i);  
               
  }Top

18 楼lgoce(Uping)回复于 2003-11-03 20:52:16 得分 10

B只是接口A一中实现而已,在第三者调用play(String)方法的时候不想知道play(String)里面具体怎么处理字符串,也有可能不知道。所以就定义了一个接口A,   具体A由谁去实现,去怎么实现他并不关心,比如说B的实现是想把字符全部转换成大写,而另外有了一个实现接口A的C,   而它的play(String)方法是想把所有的字符转换成小写。因此接口很灵活,以前写的代码不用改动,只要直接实现这个接口就行了,所以接口的功能就是这个作用。明白否?Top

19 楼tartar(tartar)回复于 2003-11-06 17:09:02 得分 0

回:  
   
  在构造函数中调用方法我想是不成立的!  
  noratong(诺拉):针对RemoveHTMLReader程序段的解释的调用关系有点复杂~要是正在写代码的时候如何能划分出这个调用关系?  
  有点领悟~知其然不知其所以然~痛苦咧!  
  Top

20 楼binny(骑个破车看夕阳)回复于 2003-11-06 18:28:38 得分 0

gzTop

相关问题

  • 接口
  • 接口
  • DirectDraw的接口
  • 关于接口...
  • 接口调度
  • 接口问题。
  • com接口
  • 接口问题
  • java 接口
  • 接口&方法?

关键词

  • 接口
  • 代码
  • 系统
  • 文件
  • 调用
  • removehtmlreader
  • 参数
  • numchars
  • blna
  • 方法

得分解答快速导航

  • 帖主:tartar
  • noratong
  • lgoce

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo