为什么可以将变量分配给接口类型?

时间:2016-02-11 23:39:59

标签: java interface instantiation

我是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);
            }
        } 
    }
}

2 个答案:

答案 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定义的方法。