2

在java中,接口只包含方法类型、名称和参数。实际的实现是在实现它的类中完成的。鉴于此,如何创建接口的实例并像使用类对象一样使用它?有很多这样的接口,例如org.w3c.dom.Node

这是我正在使用的代码:

DocumentBuilderFactory fty = DocumentBuilderFactory.newInstance();
fty.setNamespaceAware(true);
DocumentBuilder builder = fty.newDocumentBuilder();
ByteArrayInputStream bais = new ByteArrayInputStream(result.getBytes());
Document xmldoc = builder.parse(bais);
NodeList rm1 = xmldoc.getElementsByTagName("Subject");
Node rm3 = rm1.item(0);
4

6 回答 6

9

您永远不会只创建接口的实例。您可以拥有该接口类型的字段/参数/局部变量,但这很好 - 分配给此类变量的值将始终为 null 或对接口的某些具体实现的实例的引用。关键是只处理接口的代码不需要关心实现是什么。

一个很好的例子是Collections.shuffle(List)- 我可以提供任何列表实现,它只会使用接口中声明的方法。实际对象将始终是某个具体实现的实例,但shuffle方法不需要知道或关心。

于 2012-04-16T11:00:37.270 回答
2

有两种方法可以获得可用的接口类。如果我们有接口:

public interface Vehicle{
    public void drive();
}

第一个是,正如你所说,有一个实现接口的类:

public class Car implements Vehicle{
    public void drive(){
        System.out.println("Here in my car I feel safest of all);
    }
}
Vehicle car = new Car();
v.drive();

或者您可以创建一个匿名类:

Vehicle v = new Vehicle(){
    public void drive(){
        System.out.println("Hello world");
    }
};
v.drive();
于 2012-04-16T11:01:31.483 回答
2

您不创建接口的实例 - 您创建实现接口的类的实例。您可以创建任意数量的不同实现,并选择最适合的实现。

在您的代码中,您可以使用需要符合接口的对象的实现。

于 2012-04-16T11:04:10.710 回答
1

该接口是一个具有抽象类型的特殊类,因此它无法创建她自己的实例,因为它没有类型。它有一些方法并保留实现她的类的类型。所以你可以只创建引用变量,它们引用一个对象,并确保对象的类必须实现接口。

于 2013-02-07T00:17:39.093 回答
0

这与中的相同

List<String> strings = new ArrayList<String>();

List 是一个接口,ArrayList 是一个实现类。这隐藏了实现(类),并且只提供了需求/合同(接口)。这是一种合理的编程方式,因为您可以将 ArrayList 与 LinkedList 交换(如果列表中的字符串不多。

于 2012-04-16T11:02:58.407 回答
0

您不创建接口的实例,而是创建实现接口的类的实例。

例如

Map<String, String> map = new LinkedHashMap<String, String>();

Map是一个接口,LinkedHashMap是一个实现接口的类。

于 2012-04-16T11:04:35.623 回答