接口和实例化
我一直在读一本关于Java的书(Sams在21天第6版中自学Java),我有一个问题。
书说,
接口无法实例化 : new只能创建非抽象类的实例。
然后它继续并且稍后说一段,你可以声明一个变量是一个接口类型,例如。
Iterator loop = new Iterator();
是不是因为我们使用new
实例化界面?
第二个声明错了:
然后它继续并且稍后说一段“你可以声明一个变量是一个接口类型,例如。
Iterator loop = new Iterator();"
你确实可以声明变量Iterator loop;
,您可以使用返回Iterator
方法,实现Iterator
的类的构造函数或使用匿名内部类来初始化它,但是您无法直接实例化Iterator
。
编辑:
我在网上找到了这本书。 但第五个问题。 以下是报价:
请记住,几乎在任何可以使用类的地方,您都可以使用界面。 例如,您可以将变量声明为接口类型:Iterator loop = new Iterator()当变量声明为接口类型时,它只是意味着该对象应该已实现该接口。 在这种情况下,因为Iterator包含Iterator类型的对象,所以假设您可以在该对象上调用所有三个接口的方法:hasNext(),next()和remove()。
太棒了! 有第6版的书包含如此愚蠢的错误! 难以置信的…
您无法创建接口实例。 本书所指的内容可能是一个实现给定接口的匿名内部类。 例如,您可以创建一个Runnable
,如下所示:
Runnable instance = new Runnable() { @Override public void run() { ... } };
在Iterator
接口的情况下,您必须实现在那里定义的所有3个方法: next()
, hasNext()
和remove()
。
如果有两个类:“Circle”和“Rectangle”实现接口“Area”并定义它们自己的实现方法版本getParams()和calculateArea(),
public static void main(String[] args) { Area area; //no direct instatiation Rectangle rect = new Rectangle(); Circle circ = new Circle(); area = rect;//assign as another object; indirect instantiation area.getParams(); area.calculateArea(); area = circ; area.getParams(); area.calculateArea(); }
这段代码可以正常工作。 请注意,接口对象区域已创建,但未直接实例化。 它后来被指定为实现它的类的对象。