2010-01-26 67 views
0

我必须使用一个附带一些例子的API。在其中一个示例中,直接使用接口调用该接口的其中一个方法。但是,由于Interface不包含任何实现,所以我想知道:如何在示例中使用方法来完成任何操作,而无需定义实现该接口的类?或者,界面是否也包含完整的方法定义? (这似乎是这里的情况)Java接口问题

+0

你可以发布代码示例吗?即使名称改变了,也有助于获得准确的答案。 – Jean 2010-01-26 10:44:05

回答

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 
2

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

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

在这种情况下,a将是实现InterfaceA一个类的实例 - 这是什么类是没有按无所谓,因为你关心的只是界面方法。

+0

小写的方法;) – Bozho 2010-01-26 10:47:01

+0

:) 太多的C#... – thecoop 2010-01-26 10:48:07

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

查找在其中创建的对象。你可以有:

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

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

因此通过观察doSomethingElse()方法也可能会出现,它并没有实现,但谁调用的方法提供的实现(MyInterfaceImplementation在这种情况下);

1

也许你的意思是这样:

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

如果是这样,它被称为anonymous inner class

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中主要用于其他语言将使用语言结构(如函数指针,闭包或回调)的事物:传递一段代码以在您调用的方法中执行。