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。类型转换不能改变对象,只能改变引用。