// I've cut down the code to get to the point
abstract class TwoDShape {
.... constructors
.... example variables & methods
abstract double area();
}
以下是令人困惑的地方,为什么尽管应引起编译时错误的Abstract规则仍允许
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();
}
}
}
最佳答案
无法创建的是抽象类的直接实例:
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
创建数组类型。关于java - 抽象类混淆,对象声明和对象引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51571262/