【问题标题】:Is it possible to create an object of an interface in java?是否可以在java中创建接口的对象?
【发布时间】:2012-04-16 10:58:11
【问题描述】:

在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);

【问题讨论】:

    标签: java interface instance anonymous-class


    【解决方案1】:

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

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

    【讨论】:

    • 是说我正在使用的“节点”(在链接中)实际上是在某个类的某个地方实现的。我正在使用该类的一个 istance?
    • 但是在哪里提供了实现呢?
    • @Ashwin:如果没有看到您尝试使用什么,我们不可能知道。如果您特别地在谈论Node 接口,那么它通常取决于您将使用DocumentBuilderFactory.newInstance 获取的实现。通常,您不应该关心 - 如果给您一个接口,只需使用其中的方法即可。
    • 好的.. 是的,我只是在谈论节点。那么 DocumentBuilderFactory.newInstance 返回一个 Node 的实现?
    • @Ashwin:不——看看声明——但这是进入 XML API 的一种典型途径,它非常非常基于接口。所以你经常使用DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(),它会给你一个Document 实现,然后你可以用它来添加额外的元素等。目前还不清楚你真正想要找出什么......
    【解决方案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();
    

    【讨论】:

    • 好的..但是这里发生了什么。 NodeList nodelist1=xmldoc.getElementsByTagName("Subject");节点 node1=rm1.item(0); node1.getFirstChild().setNodeValue(suserid); . node1 的实现在哪里?
    • @Ashwin 您正在调用的代码将使用特定的实现。这将在某个时候创建​​(在创建 Document 期间或在调用 getElementsByTagName 期间。
    • @Ashwin 本质上,这应该没关系。你所有的代码应该关心的是它是一个Node,而不是什么样的Node。如果您只是好奇,您可以使用:node1.getClass().getName() 找出实现类的类名。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这和中的一样

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

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

        【讨论】:

          【解决方案6】:

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

          例如

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

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

          【讨论】:

            猜你喜欢
            • 2020-08-26
            • 2011-03-11
            • 2020-08-23
            • 1970-01-01
            • 1970-01-01
            • 2016-02-26
            • 2011-04-29
            • 1970-01-01
            • 2019-03-19
            相关资源
            最近更新 更多