抽象类混淆,对象声明和对象引用?

时间:2018-07-28 12:11:45

标签: java abstract-class

// 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();
  }

 }
}

2 个答案:

答案 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被声明为抽象的,因此编译器将引发错误。

您可能需要阅读这些内容以进行进一步说明: