这是什么类型的Java构造函数调用?

时间:2012-02-06 22:48:34

标签: java constructor overrides

我从来没有遇到过这样的事情,我也不知道这种类型的编码! 这是什么? (我对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 个答案:

答案 0 :(得分:5)

那是anonymous class

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

  

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

在您的特定情况下,DefaultHandler类是一个帮助程序类,它通过提供方法实现多个接口(EntityResolverDTDHandlerContentHandlerErrorHandler)什么也不做。我们的想法是,您可以从此类派生并仅覆盖您需要的特定方法。这比直接实现接口的代码少得多,因为那时你需要为每个方法提供定义,包括你不打算使用的方法。

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)