Java接口问题

时间:2010-01-26 10:41:59

标签: java interface

我必须使用附带一些示例的API。在其中一个示例中,接口直接用于调用该接口的方法之一。但是,由于Interface不包含任何实现,我想知道:如果不定义实现该接口的类,如何在示例中使用这些方法来完成任何事情?

或者,界面是否也包含完整的方法定义? (这似乎就是这种情况)

6 个答案:

答案 0 :(得分:4)

不,界面仅包含方法签名。您无法在界面中实现。

在你的情况下(最有可能)发生的事情是(伪代码):

InterfaceA {
    methodA();
}

class A implements InterfaceA {
   methodA() // implementation
}

InterfaceA getInterface() {
   // some code which returns an object of a class which implements InterfaceA
}

通话方式:

InterfaceA in = getInterface() // you might get an instance of class A or any other class which implements InterfaceA

in.methodA(); // implementation from whatever class the method returned

答案 1 :(得分:2)

你的意思是这样......

InterfaceA a = getInterface();
a.method();

在这种情况下,a将是实现InterfaceA的类的实例 - 该类无关紧要,因为您关心的只是接口方法。

答案 2 :(得分:2)

  • 接口的具体实现必须存在。然而,它的接口引用了它,这就是为什么它看起来像接口上的调用方法。
  • 接口不能有实现(“完整方法定义”)

查看对象的创建位置。你可以:

public void doSomething() {
    MyInterface interface = new MyInterfaceImplementation();
    doSomething(interface);
}

public void doSomethingElse(MyInterface interface) {
    interface.someMethod();
}

因此,通过查看doSomethingElse()方法,它可能看起来没有实现,但是调用该方法的人提供了实现(在这种情况下为MyInterfaceImplementation);

答案 3 :(得分:1)

界面只定义合约。你必须有一个实现来做实际的东西。

您所指的必须是“Program to an interface, not an implementation”,这是最佳做法。

或者API可能使用Dependency Injection来提供实现,但您只看到代码的使用方式。

答案 4 :(得分:1)

也许你的意思是这样的:

    (new Runnable(){
        public void run() {
            System.out.println("I'm running already!");
        }
    }).run();

如果是,则称为anonymous inner class

答案 5 :(得分:1)

你可能会谈到两件事:

public static void sort(List list, Comparator c){ ... }

这里,参数list的接口类型为List,但是调用该方法的任何人都必须传入一个实现接口的具体类实例,如ArrayList,该方法的代码将调用该具体类的方法 - 这种机制称为“动态方法调度”,并且是多态性核心OO原则的核心。

sort(myList, new Comparator(){
    public int compare(Object o1, Object o2){
        ...
    }
});

这是一个匿名类的示例:代码实际上定义了一个没有实现Comparator接口的名称的新类,同时创建了该类的实例。这在Java中主要用于其他语言使用语言结构(如函数指针,闭包或回调)的事情:传递一段代码以便在您调用的方法中执行。