接口和实例化

我一直在读一本关于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(); } 

这段代码可以正常工作。 请注意,接口对象区域已创建,但未直接实例化。 它后来被指定为实现它的类的对象。