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 ではなくなります。それらは現在シェイプです。
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 でチェックしていることを確認してください。これは、実際には Circle である Shape を Square にキャストしようとすると IllegalClassCastException が発生するためです。型キャストはオブジェクトを変更できず、参照のみを変更できます。