作为 SeekableByteChannel是一个接口,我们如何从Files类的newByteChannel方法调用它的方法。
我知道如何调用它。但我无法理解这个概念,因为接口没有实现行为
另外1个问题。我在java示例代码中多次看到调用或调用接口方法。但据我所知,接口没有初始化或实现方法。
SeekableByteChannel idd = Files.newByteChannel(file);
idd.size();
上述代码是如何工作的,因为SeekableByteChannel是一个接口,而Files类没有实现SeekableByteChannel的方法。所以在那里初始化SeekableByteChannels方法。
请帮助
答案 0 :(得分:0)
看来你的基本问题是界面是如何工作的。接口的常用术语是“契约”。如果您的类实现了接口,它将实现此合同。合同意味着类必须定义接口中声明的函数。因此,如果我们有 -
Interface InterfaceTest{
void foo();
}
Class Implementer implements InterfaceTest{
类Implementer必须实现函数foo(),否则会出现编译错误 -
void foo(){
//Do stuff.
}
请注意,Files
不实施SeekableByteChannel
。因此Files
不与它有任何关系。因此Files
可以拥有它想要的任何功能,包括SeekableByteChannel
中没有问题的功能。
答案 1 :(得分:0)
Java中的interface
只不过是契约;在编译器级别,唯一的合同是,如果你implements
一个接口,你必须有一个所有方法的实现(对于不是abstract
的类):
public interface Foo
{
/*
* Any invocation of this method sends the instance to the moon
*/
void foo();
}
如果您有一个可以实例化的具体类,并且实现了Foo
,例如:
public class MyClass
implements Foo
{
// must implement foo()
@Override
public void foo() { stayOnEarth(); }
}
然后你可以这样做:
final Foo foo = new MyClass();
由于您引用了Foo
类型的实例,这意味着您可以在其上调用foo()
:
foo.foo();
JVM将查找方法foo()
并找到它。
现在:您已实施foo()
的事实是一回事;你遵守这个界面的合同是另一回事。编译器没有给出< beep>如果你留在地球上或直接去Antares:它无法强制执行。
这首先是一个信任问题:如果你实现了一个接口,你应该理解这个接口意味着什么;这就是为什么有文件。编译器无法继续帮助,但强制您至少实现所需的方法。