zih*_*oyu 46 java oop interface
几天前我接受了采访,并抛出了这样的问题.
问:反转链表.以下代码给出:
public class ReverseList {
interface NodeList {
int getItem();
NodeList nextNode();
}
void reverse(NodeList node) {
}
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我不知道接口对象可以用作方法参数.面试官解释了一下,但我仍然不确定.有人可以开导我吗?
Mic*_*rdt 59
这实际上是使用界面最常用和最有用的方法之一.接口定义了一个契约,你的代码可以与任何实现接口的类一起工作,而不必知道具体的类 - 它甚至可以用于编写代码时尚不存在的类.
Java标准API中有许多示例,尤其是在集合框架中.例如,Collections.sort()可以排序任何实现的List
接口(不只是ArrayList
或者LinkedList
,虽然实现自己的List
不常见),其内容实现Comparable
接口(不只是String
或数值包装类-和拥有自己的类实现Comparable
为目的很常见).
Ben*_*tto 27
它不是传递给方法的接口"对象",仍然只是一个常规对象.这只是一种说法"此参数将接受支持此接口的任何对象".它等同于接受基类类型的某个对象,即使您传入的是子类.
这称为接口编程.您不需要编写特定的节点列表实现类,而是编写所有这些实现实现的接口.
这样,如果有人NodeList
在您编写了反向方法之后编写了一个新的更好的实现,并且您不必为每个新实现调整代码,那么您的代码仍然可以工作NodeList
.
参数需要一个对象,该类实现一个接口(参数).
在伪 Java中代码:
void reverse(NodeList node) {
// your code
}
Run Code Online (Sandbox Code Playgroud)
等于:
reverse(x) {
if(x == null || x instanceof NodeList) {
// your code
}else throw new RuntimeException("Some sort of error.");
}
Run Code Online (Sandbox Code Playgroud)
注意; 在此处阅读有关接口的更多信息:http://java.sun.com/docs/books/tutorial/java/IandI/interfaceAsType.html