SeekableByteChannel如何运作?

时间:2013-06-12 19:38:10

标签: java

作为 SeekableByteChannel是一个接口,我们如何从Files类的newByteChannel方法调用它的方法。

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

另外1个问题。我在java示例代码中多次看到调用或调用接口方法。但据我所知,接口没有初始化或实现方法。

SeekableByteChannel idd =  Files.newByteChannel(file);
idd.size();

上述代码是如何工作的,因为SeekableByteChannel是一个接口,而Files类没有实现SeekableByteChannel的方法。所以在那里初始化SeekableByteChannels方法。

请帮助

2 个答案:

答案 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:它无法强制执行

这首先是一个信任问题:如果你实现了一个接口,你应该理解这个接口意味着什么;这就是为什么有文件。编译器无法继续帮助,但强制您至少实现所需的方法。