是否可以在构造函数中实现接口?

时间:2011-05-04 14:31:31

标签: java

这个问题可能看起来毫无意义。但是,任何人都可以向我澄清我对这个问题的编码。我正在进行与解析相关的大学项目。所以我在推荐HtmlCleaner。我对此编码感到困惑。

final CleanerProperties props = new CleanerProperties();
final HtmlCleaner htmlCleaner = new HtmlCleaner(props);
final SimpleHtmlSerializer htmlSerializer = 
    new SimpleHtmlSerializer(props);

// make 10 threads using the same cleaner and the same serializer 
for (int i = 1; i <= 10; i++) {
    final String url = "http://search.eim.ebay.eu/Art/2-1/?en=100&ep=" + i;
    final String fileName = "c:/temp/ebay_art" + i + ".xml";
    new Thread(new Runnable() {
        public void run() {
            try {
                TagNode tagNode = htmlCleaner.clean(new URL(url));
                htmlSerializer.writeToFile(tagNode, fileName, "utf-8");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

我们可以在构造函数中实现一个接口吗?(Thread类,Runnable接口)。是否有人可以帮助我理解它背后的概念或建议一些文章来研究这个概念? 提前谢谢......

5 个答案:

答案 0 :(得分:5)

您声明一个匿名类“继承自”(或在本例中为实现)一个Runnable。

Thread只使用现有的Thread构造函数(一个接受Runnable的构造函数)。匿名类是Java的一部分(并且已经存在很长时间了):http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#252986

答案 1 :(得分:4)

在您的示例中,您不在构造函数中创建接口。

该片段显示了Runnable的匿名子类的实现。 匿名因为此类的类型没有名称。

new Runnable(...语句创建对该匿名类实例的引用,将引用传递给构造函数Thread(Runnable r)


注意 - 我们可以通过三个步骤完成相同的操作,这更容易理解:

// create an anonymous implementation of Runnable
Runnable r = new Runnable() {
     @Override
     public void run() {
       // the run implementation
     }
   };

// create a Thread
Thread t = new Thread(r);

// start the Thread -> will call the run method from the Runnable
t.start();

答案 2 :(得分:0)

答案 3 :(得分:0)

new Thread(new Runnable() {
    public void run() {
        try {
            TagNode tagNode = htmlCleaner.clean(new URL(url));
            htmlSerializer.writeToFile(tagNode, fileName, "utf-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

new Runnable() {...}宣布Anonymous Inner Classes

答案 4 :(得分:0)

命令new只能在这种情况下与接口一起使用,您可以立即定义方法。