我是Java的新手,正在尝试学习界面的概念。我在网上看到了下面的代码。我知道接口无法实例化。我的问题是,WatchService,Path,WatchKey和WatchEvent都是接口,为什么变量可以分配给接口类型?是和实例化一样吗?
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
public class WatchServices {
public static void main(String[] args) throws IOException {
WatchService ws1 = FileSystems.getDefault().newWatchService();
Path p1 = Paths.get("/Users/justin/Desktop/Codes Netbean/JavaRandom");
WatchKey wk1 = p1.register(ws1, ENTRY_CREATE);
while(true){
for(WatchEvent<?> event : wk1.pollEvents()){
System.out.println(event.kind());
Path file = (Path)event.context();
System.out.println(file);
}
}
}
}
答案 0 :(得分:5)
我会以一个例子回答你。
假设我请你带我sphere。然后你带我一个沙滩球。
球体不存在,它是一个概念,一个几何物体和一个沙滩球是一个可以被视为球体的物质对象。
这大致相同,interface
通过其公开的接口定义对象的特征(可以在假装implement
接口的对象上调用的方法)但它不是物质对象本身。
所以即使球体不存在,我也可以将沙滩球视为球体。实例化球体没有任何意义,因为球体无法实例化,但我可以将沙滩球视为球体。
答案 1 :(得分:1)
接口定义了一组可以调用的方法,但没有实现它们。这就是为什么你永远不能说Runnable x = new Runnable()
。可以定义一个类,它实现接口中的所有方法。它还必须声明它实现了该接口:
interface Runnable {
public void run();
}
public class RandomTask implements Runnable {
public void run() {
System.out.println("Doing some stuff...");
}
public void shout() {
System.out.println("DOING STUFF...");
}
}
了解类如何实现接口。因此,RandomTask 是可运行的,因此您可以在需要Runnable的地方分配RandomTask:
Runnable x = new RandomTask();
界面告诉您该对象必须存在哪些方法。我们知道x
必须有run()
方法,因为它是Runnable。所以我们可以说
x.run();
现在,当你程序员知道x有一个shout()
方法时,你就不能再访问了它。通过将x
分配给Runnable,可以将其限制为仅具有为Runnable定义的方法。