0

クラスのさまざまなサブクラスへの参照を含む参照の配列を作成する方法がわかりません。

Shapes への参照の 5x5 グリッドが必要だとしましょう。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)動作しません。サブクラスのオブジェクトを作成せずに、配列の各要素にどのサブクラスを入れるかを指定する方法はありますか? これらのオブジェクトのプロパティ (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 配列に追加すると、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 が発生するためです。型キャストはオブジェクトを変更できず、参照のみを変更できます。

于 2013-10-18T18:14:08.663 に答える