0

我不知道如何创建一个引用数组,其中包括对一个类的不同子类的引用。

假设我想要一个 5x5 网格对 Shapes 的引用。Shapes 类包括三角形、圆形和正方形的子类。

Shapes[][] myGrid = new Shapes[5][5];

现在我想指定 Shapes[1][1] 拥有一个 2 英寸的正方形。我可以使用:

Shapes[1][1] = new Square(2);

但我希望能够只在数组中放置一个引用,而不是一个实际的对象。更像这样:

Shapes[1][1] = Square(2);

Shapes[1][1] = new Square(2)工作,但Shapes[1][1] = Square(2)不工作。有没有办法在不创建这些子类的对象的情况下指定哪个子类进入数组的每个元素?如果我不指定这些对象的属性(如两英寸)会更好吗?

提前致谢!

4

1 回答 1

0

Java 对象引用已经是对对象的引用。如果你这样做

Object[] array = new Object[2];
String string = "hello world";
Foo foo = new Foo();

array[0] = string;
array[1] = foo;

您已经只在数组中放置了对 foo 和 string 的引用。如果按照上述方式执行此操作,您现在对每个对象都有 2 个引用:string 和 array[0] 指向同一个对象,而 foo 和 array[1] 指向同一个对象。

我想您真正要问的是您是否可以在 Java 中使用不同类型的元素创建一个数组,而您不能。将子类添加到超类数组会根据定义向上转换它们。当您将 Square 对象引用添加到 Shape 数组时,它们不再是 Squares。他们现在是形状。

如果要将 Shape 数组中的 Square 和 Circle 对象作为 Squares 和 Circles 访问,则需要向下转换它们:

for (int i = 0; i < myGrid.length; i++) {
    for (int k = 0; k < myGrid[i].length; k++) {

        Point xy = myGrid[i][k].getShapeThing();

        if (myGrid[i][k] instanceof Square) {
            Square square = (Square)myGrid[i][k];
            int w = square.getSquareThing();

        } else if (myGrid[i][k] instanceof Circle) {
            Circle circle = (Circle)myGrid[i][k];
            int d = circle.getCircleThing();
        }
    }
}

您也可以像这样进行内联转换:

int w = ((Square)myGrid[i][k]).getSquareThing();

如果您以这种方式制作数组,请确保在转换之前使用 instanceof 进行检查,因为如果您尝试将实际上是圆形的 Shape 转换为 Square,则会收到 IllegalClassCastException。类型转换不能改变对象,只能改变引用。

于 2013-10-18T18:14:08.663 回答