初始化接口?

时间:2012-01-12 20:49:59

标签: java object netbeans interface initialization

在我遇到的当前问题中(printing a file to a physical printer in Java)我一直在运行代码,就像一个疯子试图从所使用的每个类的javadoc中吞噬任何有用的遗漏信息。

现在,我从以前的问题中提取了相当多的代码,所以有一点我没有写自己。我注意到的问题是我抓到的代码是初始化一个对象,比如说是“SimpleDoc”,它实现了一个接口(Doc)并将它分配给那个接口?!

Little Code片段:

Doc mydoc = new SimpleDoc(textStream, flavor, null);

现在,据我所知,我们在java中创建对象。我熟悉继承,我熟悉使用接口允许类“继承”多个超类的技巧。

但这只是坚持正确。你可以创建一个实现接口的类,这对我很好。但是,当创建一个接口并将一个对象简化为其接口时,这里发生了什么?当我完全引用mydoc时我在访问什么?

2 个答案:

答案 0 :(得分:6)

诀窍是要意识到你并非“创造”,“实例化”或“初始化”界面。您只是将变量定义为您知道实现该接口的东西。

你实际上是在告诉其他正在编写这段代码的程序员,对于这个方法的其余部分,你只对myDocDoc这一事实感兴趣(即满足{Doc的事实。 1}}接口)。这可以使编程更简单,因为IDE的自动完成现在只显示由此接口定义的方法,而不是SimpleDoc能够执行的所有操作。

想象一下,将来您希望扩展您的功能,以便根据某些输入您可以拥有不同的Doc实现。您可以说:

,而不是显式创建SimpleDoc
Doc mydoc = docFactory.getByType(inputType);

docFactory可以生成任何类型的Doc,并且此方法并不真正关心实例化哪种类型,因为无论如何它都会像Doc一样对待它。

答案 1 :(得分:5)

您无法创建接口,您在此处执行的操作是创建实现接口mydoc的类SimpleDoc的对象Doc。由于该类实现了此接口,因此您可以处理mydoc,就像它是该接口的实例一样。这允许您访问界面中所有已声明的方法,这些方法在类SimpleDoc

中实现

例如,如果您的Doc-Interface看起来像这样:

public interface Doc {
    void print();
}

,你的SimpleDoc类看起来像这样:

public class SimpleDoc implements Doc {

    public void clear() { ... }

    @Override
    public void print() { ... }

}

...那么您只能访问print() - mydoc - 对象的方法。但你也可以说:

SimpleDoc mydoc = new SimpleDoc();

...然后你也可以拨打clear()