Java 接口和实例化

Java 接口和实例化,java,Java,我一直在读一本关于Java的书(Sams自学Java 21天第6版),我有一个问题 书上说 接口不能实例化:新建只能创建非抽象类的实例 然后,它接着说了一段话,稍后您可以声明一个变量为eg的接口类型 Iterator loop = new Iterator(); 这不是在我们使用new时实例化接口吗?您不能创建接口实例。本书所指的可能是实现给定接口的匿名内部类。例如,您可以创建一个可运行的,如下所示: Runnable instance = new Runnable() { @Overr

我一直在读一本关于Java的书(Sams自学Java 21天第6版),我有一个问题

书上说

接口不能实例化新建只能创建非抽象类的实例

然后,它接着说了一段话,稍后您可以声明一个变量为eg的接口类型

Iterator loop = new Iterator();

这不是在我们使用
new
时实例化接口吗?

您不能创建接口实例。本书所指的可能是实现给定接口的匿名内部类。例如,您可以创建一个
可运行的
,如下所示:

Runnable instance = new Runnable() {
   @Override
   public void run() {
      ...
   }
};

对于
迭代器
接口,您必须实现其中定义的所有3个方法:
next()
hasNext()
remove()
第二个声明是错误的:

然后它接着说了一段话,“您可以声明一个变量为接口类型,例如,
Iterator loop=new Iterator();”

您确实可以声明变量
迭代器循环
,您可以使用返回
迭代器的方法初始化它,该方法是实现
迭代器的类的构造函数,或者使用匿名内部类,但是您不能直接安装
迭代器

编辑:

我在网上找到了这本书。但是第五条。以下是引文:

请记住,几乎所有可以使用类的地方,都可以使用接口。例如,可以将变量声明为接口类型: Iterator loop=new Iterator()当一个变量被声明为接口类型时,它仅仅意味着该对象应该已经实现了该接口。在本例中,由于迭代器包含一个迭代器类型的对象,因此假设您可以在该对象上调用inter-face的所有三个方法:hasNext()、next()和remove()

太棒了!有第六版的书有这么愚蠢的错误!难以置信…

如果有两个类:“Circle”和“Rectangle”实现了接口“Area”,并定义了各自版本的实现方法getParams()和calculateArea()


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

new Iterator()
将不正确。通常,对象可能有一个名为
getIterator()
的方法。您是否检查了勘误表?如果这是唯一的代码片段,并且
Iterator
指的是
java.util.Iterator
,那么这本书发布的代码是错误的。您可以实例化实现该接口的类。不能直接实例化接口。我注意到他们没有给迭代器一个泛型类型,那本书有多长时间了?代码证明了“你不可能在21天内学会Java”。说吧,这有用吗?它接着说,“当一个变量被声明为接口类型时,它是一个实现接口的对象。在这种情况下,因为循环是迭代器类型的对象,所以假设您可以在该对象上调用接口的所有3个方法:hasNext(),Next(),remove()。”作者可能读到-“如何在21天内写书”:
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();
}