在我遇到的当前问题中(printing a file to a physical printer in Java)我一直在运行代码,就像一个疯子试图从所使用的每个类的javadoc中吞噬任何有用的遗漏信息。
现在,我从以前的问题中提取了相当多的代码,所以有一点我没有写自己。我注意到的问题是我抓到的代码是初始化一个对象,比如说是“SimpleDoc”,它实现了一个接口(Doc)并将它分配给那个接口?!
Little Code片段:
Doc mydoc = new SimpleDoc(textStream, flavor, null);
现在,据我所知,我们在java中创建对象。我熟悉继承,我熟悉使用接口允许类“继承”多个超类的技巧。
但这只是坚持正确。你可以创建一个实现接口的类,这对我很好。但是,当创建一个接口并将一个对象简化为其接口时,这里发生了什么?当我完全引用mydoc时我在访问什么?
答案 0 :(得分:6)
诀窍是要意识到你并非“创造”,“实例化”或“初始化”界面。您只是将变量定义为您知道实现该接口的东西。
你实际上是在告诉其他正在编写这段代码的程序员,对于这个方法的其余部分,你只对myDoc
是Doc
这一事实感兴趣(即满足{Doc
的事实。 1}}接口)。这可以使编程更简单,因为IDE的自动完成现在只显示由此接口定义的方法,而不是SimpleDoc
能够执行的所有操作。
想象一下,将来您希望扩展您的功能,以便根据某些输入您可以拥有不同的Doc实现。您可以说:
,而不是显式创建SimpleDocDoc 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()