如何创建包含对类的不同子类的引用的引用数组

时间:2013-10-18 17:58:50

标签: java arrays multidimensional-array polymorphism subclass

我不知道如何创建包含对类的不同子类的引用的引用数组。

假设我希望有一个5x5的Shapes引用网格。 Shapes类包括三角形,圆形和正方形的子类。

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

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

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

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

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

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

提前致谢!

1 个答案:

答案 0 :(得分: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数组时,它们不再是Square。他们现在是形状。

如果您想要将Square数组中的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,因为如果你试图将一个实际上是Circle的Shape转换为Square,你将得到一个IllegalClassCastException。类型转换不能更改对象,只能引用。