我一直在读一本关于Java的书(Sams在21天第6版自学Java),我有一个问题。
书上写着,
接口无法实例化: 新 只能创建非抽象的实例上课。
然后它会继续并且稍后会说一个段落,您可以将变量声明为接口类型,例如。
Iterator loop = new Iterator();
是不是我们使用new
来实例化界面?
答案 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();
}
此代码可以正常工作。请注意,接口对象区域已创建,但未直接实例化。它后来被指定为实现它的类的对象。