我已经从java documentation开始研究java 8中的nio.2
。当我研究java.nio.file.Path
时,java文档的第一行是
Java SE 7版本中引入的Path类。
表示Path
是一个类,但当我查看here时,我发现Path
是interface
。
为什么java documentation说它是一个类。
我的另一个疑问是,如果Path
是interface
,那么Path
方法(例如getRoot()
isAbsolute()
和其他所有方法)是如何运作的,因为没有实现Path
接口的方法。
我知道在一个陈述中提出两个不同的问题很麻烦,但我不知道这两个问题是如何分开的。
修改:此问题不能与this重复,因为在this问题中,提问者要求实施Path
界面,但在此我我在问这个接口的方法是如何工作的,我的意思是它是由JVM内部执行的,还是用来执行它们的任何其他机制。
答案 0 :(得分:4)
Path
是一个普通的interface
,它由任何其他interface
实现,具体class
声明实现它并为{{1}提供具体方法} abstract
的方法。所以interface
的方法没什么特别之处。正如linked question所解释的那样,是此Path
的普通实现。
您不应该感到困惑,因为它在文档中称为“类”。虽然最狭义的interface
是与class
或interface
s不同的类型,但这些类型都是该术语最广泛含义的类。这可以通过以下事实反映:它们都存储在enum
中,并通过class file
上的操作名称loadClass
加载。在这些地方,没有区分接口和类。从这个角度来看,接口和枚举只是具有特殊属性的类(类似地,注释是具有特殊属性的接口)。
在文档中,当你使用它的方式没有区别时,在更广泛的意义上使用术语“类”是有意义的,即你在ClassLoader
实例上调用方法而不必关心是否Path
类型为Path
。只有当读者是必须实施它的人时,才必须强调差异。
答案 1 :(得分:1)
Path是一个接口,因为具体实现取决于底层文件系统。这些方法在实现接口的类中,这些是依赖于平台的。
请注意,您永远不会使用new
构建Path对象,而是使用类似Paths.get
的方法,该方法返回相应类的实例。
例如,在Oracle的实现中,Windows中的路径由sun.nio.fs.WindowsPath
(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/nio/fs/WindowsPath.java)实现