我必须使用附带一些示例的API。在其中一个示例中,接口直接用于调用该接口的方法之一。但是,由于Interface不包含任何实现,我想知道:如果不定义实现该接口的类,如何在示例中使用这些方法来完成任何事情?
或者,界面是否也包含完整的方法定义? (这似乎就是这种情况)
答案 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中主要用于其他语言使用语言结构(如函数指针,闭包或回调)的事情:传递一段代码以便在您调用的方法中执行。