Java SeekableByte频道是如何工作的?

Java SeekableByte频道是如何工作的?,java,Java,作为 是一个接口,我们如何从文件类的方法调用它的方法 我知道如何调用它,但是我不能理解这个概念,因为接口没有实现这个行为 还有一个问题。我在java示例代码中多次看到调用或调用接口方法。但据我所知,接口并不初始化或实现这些方法 SeekableByteChannel idd = Files.newByteChannel(file); idd.size(); 上面的代码是如何工作的,因为SeekableByteChannel是一个接口,而Files类没有实现SeekableByteChanne

作为 是一个接口,我们如何从文件类的方法调用它的方法


我知道如何调用它,但是我不能理解这个概念,因为接口没有实现这个行为

还有一个问题。我在java示例代码中多次看到调用或调用接口方法。但据我所知,接口并不初始化或实现这些方法

SeekableByteChannel idd =  Files.newByteChannel(file);
idd.size();
上面的代码是如何工作的,因为SeekableByteChannel是一个接口,而Files类没有实现SeekableByteChannel的方法


请帮助

看来您的根本问题是接口如何工作。与接口相关的常用术语是合同。如果您的类实现了一个接口,那么它将实现这个契约。契约意味着类必须定义接口中声明的函数。因此,如果我们有—

Interface InterfaceTest{
    void foo();
}

Class Implementer implements InterfaceTest{
类实现者必须实现函数foo,否则将出现编译器错误-

void foo(){
    //Do stuff.
}
请注意,文件不实现SeekableByteChannel。因此,文件与它没有任何关系。因此,文件可以具有它想要的任何功能,包括SeekableByteChannel中没有问题的功能

Java中的接口只不过是一个契约;在编译器级别,唯一的约定是,如果实现接口,则必须实现非抽象类的所有方法:

如果您有一个可以实例化并实现Foo的具体类,例如:

public class MyClass
    implements Foo
{
    // must implement foo()
    @Override
    public void foo() { stayOnEarth(); }
}
然后你可以做:

final Foo foo = new MyClass();
由于您有对类型为Foo的实例的引用,这意味着您可以在其上调用Foo:

JVM将查找方法foo并找到它

现在:您已经实现了foo这一事实是一回事;您遵守此接口的契约是另一个事实。如果你呆在地球上或者直接去心宿二,编译器不会给出一个答案:它不能强制执行


这首先是一个信任的问题:如果你实现了一个接口,你应该理解这个接口的含义;这就是为什么有文档。编译器只能强制要求您至少实现所需的方法。

接口不实现该行为,此时提及多态性可能也不错。尽管测试并没有给出foo的实现,但某个类在某个地方给出了foo的实现。我们只知道它实现了测试,所以我们可以称之为foo。我知道你们在解释什么。但它没有回答我的问题question@Dgrin91SeekableByteChannelidd=Files.newByteChannelfile;缺碘量;你能给我解释一下上面的内容吗code@fgeWhat你不明白吗?SeekableByteChannel是一个接口。这意味着这些方法在SeekableByteChannel中没有初始化,甚至连Files类也没有实现SeekableChannel方法。因此,SeekableByteChannel方法“size”从何处初始化。@fgeIt无所谓。在运行时,JVM将在对象实例中查找该方法。通过接口访问它的事实是次要的。这就像执行List List=new ArrayList.Files.newByteChannel时一样,它是一个静态工厂方法:它实例化一个实现SerializableByteChannel的对象。
final Foo foo = new MyClass();
foo.foo();