2016-02-11 43 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定義的方法。

相關問題