初始化接口?

在我遇到的一个当前问题中( 用Java打印文件到物理打印机 )我一直在运行代码,就像疯子一样,试图从所使用的每个类的javad中吞噬任何有用的遗漏信息。

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

Little Code片段:

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

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

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

诀窍是要意识到你不是在“创建”,“实例化”或“初始化”界面。 您只是将变量定义为您知道实现该接口的内容。

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

想象一下,在未来您希望扩展您的function,以便根据某些输入您可以拥有不同的Doc实现。 您可以说:而不是显式创建SimpleDoc:

 Doc mydoc = docFactory.getByType(inputType); 

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

你不能创建接口,你在这里做的是你创建一个实现接口Doc的类SimpleDoc的对象mydoc 。 由于该类实现了此接口,因此您可以像处理该接口的实例一样处理mydoc 。 这允许您访问界面中所有声明的方法,这些方法在SimpleDoc类中SimpleDoc

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

 public interface Doc { void print(); } 

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

 public class SimpleDoc implements Doc { public void clear() { ... } @Override public void print() { ... } } 

…那么你只能访问你的mydoc -object的print()方法。 但你也可以说:

 SimpleDoc mydoc = new SimpleDoc(); 

…然后你也可以打电话给clear()