接口和实例化

4
我一直在阅读一本关于Java的书(Sams Teach Yourself Java in 21 Days 6th edition),我有一个问题。
书中提到:
接口不能被实例化:new只能创建一个非抽象类的实例。
然后书中又说,几段话之后,您可以声明一个变量为接口类型。例如:
Iterator loop = new Iterator();

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


1
new Iterator() 是不正确的。通常一个对象可能有一个名为 getIterator() 的方法。你检查过勘误表了吗? - bblincoe
1
如果这是唯一的代码片段而且“Iterator”指的是“java.util.Iterator”,那么这本书发布的代码是错误的。 - Sotirios Delimanolis
你可以实例化实现接口的类,但不能直接实例化接口。我注意到他们没有给迭代器指定泛型类型,那本书有多久了? - Elliott Frisch
2
这段代码证明了一个事实 - “你不可能在21天内学会Java”。请远离。 - Rohit Jain
这有帮助吗?它接着说:“当一个变量被声明为接口类型时,它是实现该接口的对象。在这种情况下,因为loop是Iterator类型的对象,假设您可以在该对象上调用接口的所有3个方法:hasNext()、next()、remove()。” - Simon
你可以声明一个变量为接口类型。书上说得对。下一个是打错了。应该是 Iterator loop; - Siva Tumma
3个回答

5
第二个声明是错误的:
然后它继续说,在几段话后,“您可以声明一个变量为接口类型,例如:Iterator loop = new Iterator();” 事实上,您可以声明变量 Iterator loop; ,您可以使用返回 Iterator 的方法来初始化它,实现 Iterator 的类的构造函数或使用匿名内部类,但是您不能直接实例化 Iterator。
编辑:
我在网上找到了这本书。 但是是第5版。以下是引用:
请记住,几乎所有可以使用类的地方都可以使用接口代替。 例如,您可以声明一个变量为接口类型: Iterator loop = new Iterator() 当变量声明为接口类型时,仅意味着预计该对象已实现该接口。 在这种情况下,因为 Iterator 包含类型 Iterator 的对象,所以假设您可以在该对象上调用接口的所有三个方法:hasNext(),next()和 remove()。
太棒了! 这本书的第6版竟然有如此愚蠢的错误! 令人难以置信...

2
也许作者读过《21天写书》这本书 :) - Rohit Jain

4

你无法创建接口的实例。这本书所指的可能是一个实现了给定接口的匿名内部类。例如,你可以像这样创建一个Runnable

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

如果涉及到Iterator接口,您需要实现其中定义的所有3个方法:next()hasNext()remove()


0
如果有两个类:“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();
}

这段代码将运行良好。请注意,接口对象区域被创建但没有直接实例化。稍后它被分配为实现它的类的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接