// I've cut down the code to get to the point
abstract class TwoDShape {
.... constructors
.... example variables & methods
abstract double area();
}
下面是令人困惑的地方,尽管摘要规则应该引起编译时错误,但为什么允许TwoDShape shapes[] = new TwoDShape[4]
呢?为什么TwoDShape test = new TwoDShape();
或其他类似构造无法编译,从而导致错误?是否因为shapes[]
是对象引用(由于它位于数组中)?但这也不是对象声明(也考虑使用new)。
class AbsShapes {
public static void main(String args[]) {
TwoDShape shapes[] = new TwoDShape[4];
shapes[0] = new Triangle("outlined", 8.0, 12.0);
shapes[1] = new Rectangle(10);
shapes[2] = new Rectangle(10, 4);
shapes[3] = new Triangle(7.0);
for(int i = 0; i < shapes.length; i++) {
System.out.println("Object is " + shapes[i].getName());
System.out.println("Area is " + shapes[i].area());
System.out.println();
}
}
}
答案 0 :(得分:1)
无法创建的是抽象类的直接实例:
new TwoDShape(); //this won't compile.
但是,这不会创建TwoDShape
的直接实例:
new TwoDShape[4]; //this is creating an array of type TwoDShape
上面的代码创建一个TwoDShape
类型的数组。没有创建TwoDShape
的实例。如果调用shapes[0]
,则会得到null
,这意味着没有创建TwoDShape
对象。
换句话说,shapes
的类型不是TwoDShape
,而是TwoDShape[]
。并且可以使用new
创建数组类型。
答案 1 :(得分:1)
此行:
TwoDShape shapes[] = new TwoDShape[4]
创建一个空的大小为4的数组,该数组能够存储类型为TwoDShape
的对象。对象本身不会被创建-换句话说,在创建之后,数组将立即包含四个null
。
现在此行:
TwoDShape test = new TwoDShape();
请使用类型TwoDShape
的构造方法来创建该类型的对象。由于类TwoDShape
被声明为抽象的,因此编译器将引发错误。
您可能需要阅读这些内容以进行进一步说明: