接口和实例化

时间:2014-01-20 18:29:49

标签: java

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

书上写着,

  

接口无法实例化 只能创建非抽象的实例上课。

然后它会继续并且稍后会说一个段落,您可以将变量声明为接口类型,例如。

Iterator loop = new Iterator();

是不是我们使用new来实例化界面?

3 个答案:

答案 0 :(得分:5)

第二个声明是错误的:

  

然后它会继续并且稍后会说“你可以将变量声明为接口类型,例如。Iterator loop = new Iterator();"

您确实可以声明变量Iterator loop;,您可以使用返回Iterator的方法,实现Iterator的类的构造函数或使用匿名内部类来初始化它,但是您无法实例化{{ 1}}直接。

编辑:

我在网上找到了这本书。但第五个问题。以下是报价:

  

请记住,几乎在任何可以使用类的地方,您都可以使用界面。例如,您可以将变量声明为接口类型:   Iterator loop = new Iterator()当一个变量被声明为接口类型时,它只是意味着该对象应该已经实现了该接口。在这种情况下,因为Iterator包含Iterator类型的对象,所以假设您可以在该对象上调用所有三个接口的方法:hasNext(),next()和remove()。

优秀!有第6版的书包含如此愚蠢的错误!难以置信...

答案 1 :(得分:4)

您无法创建界面实例。本书所指的内容可能是实现给定接口的匿名内部类。例如,您可以创建Runnable,如下所示:

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

如果是Iterator界面,则必须实施其中定义的所有3种方法:next()hasNext()remove()

答案 2 :(得分:0)

如果有两个班级:" Circle"和"矩形"实现界面" 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();
}

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