// 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/

10-12 06:10