2012-02-06 74 views
6

我从来没有遇到过这样的事情,我不知道这种类型的编码! 这是什么? (我敢对Java)这是什么类型的Java构造函数调用?

DefaultHandler handler = new DefaultHandler() { 

      boolean bfname = false; 
      boolean blname = false; 
      boolean bnname = false; 
      boolean bsalary = false; 

      public void startElement(String uri, String localName,String qName, 
        Attributes attributes) throws SAXException { 

       // code 

      } 

      public void endElement(String uri, String localName, 
        String qName) throws SAXException { 

       // code 

      } 

      public void characters(char ch[], int start, int length) throws SAXException { 

       // code 
     }; 

调用构造函数有一个括号之后(!?),它似乎是有一些方法的重写。然后括号以分号结尾。构造函数调用后,我从来没有见过大括号。这是正常的吗?它怎么叫?谢谢!

p.s:在Eclipse上,如果我删除分号,则表示LocalVariableDeclarationStatement错误。

回答

5

这是一个anonymous class

当您想创建一个派生自另一个类或接口的类时,匿名类可能很有用,但您不需要在代码中的任何其他位置使用新的类。

关于匿名类的最优雅的事情之一是,它们允许您在需要的地方准确定义一次性类。另外,匿名类具有简洁的语法,可以减少代码中的混乱。

在您的具体情况DefaultHandler类是实现多个接口(EntityResolverDTDHandlerContentHandlerErrorHandler)通过提供无能为力方法辅助类。这个想法是,你可以从这个类中派生出来并且只覆盖你需要的特定方法。这可能比直接实现接口要少得多,因为那样你就需要为每个方法提供定义,包括你不打算使用的方法。

5

这是匿名类的定义。 DefaultHandler是一个接口,没有实现,你只是在创建一个,而创建一个实例。

因为DefaultHandler是一个它期望实现接口的类的对象的接口。但是如果没有这样的类或者你需要一个不同的类,你可以创建一个满足这个要求的对象,方法是通过实现接口。

+0

我知道一个实现接口的类应该定义接口中声明的所有方法,我错了吗?在我的例子中,只定义了3个方法! – Angelo 2012-02-06 23:00:23

+1

这不是一个接口 - 它是一个类。检查DefaultHandler的文档。 – 2012-02-06 23:01:44

+1

你是对的,但'DefaultHandler'可能是一个AbstractClass,在这种情况下,你只需要定义抽象方法 – destan 2012-02-06 23:02:07

4

这是一个匿名的内部类。有一个谷歌'匿名类java'。它基本上是一个通过界面即时创建的类。整个定义被指定为inline将其视为'new DefaultHandler()'部分之后的类定义,显然这个特定的类定义只能在这个地方使用。

1

那是一个匿名类的定义。它基本上是实现Abstract类或扩展类的一种方式。因此,您要么执行DefaultHandler类,要么执行DefaultHandler,具体取决于DefaultHandlerabstract类还是具体类。

相关问题