初始化接口?

Ale*_*lex 9 java netbeans initialization interface object

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

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

小代码片段:

Doc mydoc = new SimpleDoc(textStream, flavor, null);
Run Code Online (Sandbox Code Playgroud)

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

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

Str*_*ior 7

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

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

想象一下,将来你想要扩展你的功能,以便根据一些输入你可以有不同的Doc实现.您可以说:而不是显式创建SimpleDoc:

Doc mydoc = docFactory.getByType(inputType);
Run Code Online (Sandbox Code Playgroud)

docFactory能产生任何类型的Doc,并且此方法并不真正关心什么样的被实例化,因为它会像对待一个Doc不分.


Eik*_*chu 5

您无法创建接口,此处要做的是创建实现该接口mydoc的类的对象。因为该类实现了此接口,所以您可以将其视为该接口的实例进行处理。这使您可以访问接口中所有声明的方法,这些方法在类中实现SimpleDocDocmydocSimpleDoc

例如,如果您的Doc-Interface如下所示:

public interface Doc {
    void print();
}
Run Code Online (Sandbox Code Playgroud)

并且您的SimpleDoc类将如下所示:

public class SimpleDoc implements Doc {

    public void clear() { ... }

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

}
Run Code Online (Sandbox Code Playgroud)

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

SimpleDoc mydoc = new SimpleDoc();
Run Code Online (Sandbox Code Playgroud)

...然后您也可以打电话 clear()