2016-02-11 42 views
0

我是新来的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); 
      } 
     } 
    } 
} 
+4

您正在编译时间类型与运行时类型混淆。声明变量定义它是编译时类型 - 在运行时,任何兼容的引用都可以分配给它。一个'interface'指定一个被引用的对象必须满足的_contact_。因此'WatchService'是一个'interface',我们知道在运行时'FileSystems.newWatchService()'会返回一些实现这个'interface'的值 - 但我们不知道确切的类型,因为它可能是平台依赖的。有关其他示例,请参阅“集合”框架。 –

回答

4

我会用一个例子回答你。

假设我请你给我带一个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定义的方法。

相关问题