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时我访问了什么?
诀窍是要意识到你不是在"创建","实例化"或"初始化"界面.您只是将变量定义为您知道实现该接口的内容.
你基本上是告诉其他程序员对这个代码的工作,对于这种方法的其余部分,你只对一个事实,即兴趣myDoc是Doc(即,一些满足Doc接口).这可以使编程更简单,因为IDE的自动完成现在只显示由此接口定义的方法,而不是SimpleDoc能够执行的所有操作.
想象一下,将来你想要扩展你的功能,以便根据一些输入你可以有不同的Doc实现.您可以说:而不是显式创建SimpleDoc:
Doc mydoc = docFactory.getByType(inputType);
Run Code Online (Sandbox Code Playgroud)
在docFactory能产生任何类型的Doc,并且此方法并不真正关心什么样的被实例化,因为它会像对待一个Doc不分.
您无法创建接口,此处要做的是创建实现该接口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()
| 归档时间: |
|
| 查看次数: |
35348 次 |
| 最近记录: |