DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

4章11

このJavaのコードは、二次元の文字列配列arrayを持っており、その各要素を出力するためのforループを記述する必要があります。arrayの宣言にはString[][] array = { { "A", "B", "C" } };とあります。この二次元配列は実際には1つのサブ配列を持つだけで、そのサブ配列には3つの文字列"A"、"B"、"C"が含まれています。

ループでこの配列の各要素を出力するためには、arrayの各サブ配列(これも配列です)にアクセスし、その後そのサブ配列の各要素にアクセスする必要があります。ただし、このコードスニペットでは1つのループしか表示されていませんので、私たちはサブ配列の要素ではなく、サブ配列そのものを出力するループを想定する必要があります。

答えはA、「Object obj : array」となっています。この理由は、拡張forループで型Objectを使用すると、二次元配列のサブ配列(この場合はString[]型の配列)をObject型として扱うことができるからです。Javaでは、すべてのクラスが暗黙的にObjectクラスから派生しているため、任意の型の配列はObject型の配列としても扱えます。

以下にコメントを加えたコードを示します。

public class Main {
    public static void main(String[] args) {
        // 二次元文字列配列の宣言と初期化
        String[][] array = { { "A", "B", "C" } };

        // 拡張forループを使用してarrayの各要素(サブ配列)を取り出す
        // ここではサブ配列自体がobjに代入される
        for (Object obj : array) {  // Aの選択肢に対応
            // サブ配列(Object型)を出力
            System.out.println(obj);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

このコードを実行すると、サブ配列の参照(メモリ上のアドレス)が出力されます。もし、サブ配列内の各文字列を個別に出力したい場合は、二重のforループを使用する必要があります。ただし、問題では単一のforループしか使用されていないため、この選択が正しいとされています。

追記

シンプルに答えを導くためには、二次元配列と拡張forループについての基本的な理解が必要です。次のステップに従って考えると良いでしょう:

  1. 配列の理解: String[][] array と宣言されているのは、String型の要素を持つ配列の配列、つまり二次元配列です。

  2. 拡張forループの機能: 拡張forループは配列の各要素を順番に取り出すために使います。この場合、二次元配列の「各要素」とは、一次元配列(ここでは文字列の配列)です。

  3. 型の一致: 拡張forループで使われる変数の型は、配列の要素の型と一致している必要があります。例えば、int[]型の配列をループするならば、ループ内の変数はint型であるべきです。

  4. ポリモーフィズムの利用: Javaにおいては、全てのクラスが暗黙的にObjectクラスを継承しています。このため、Object型は任意のオブジェクトを参照することができます。二次元配列の各要素は一次元配列ですが、一次元配列もオブジェクトですので、Object型の変数で参照することができます。

以上の理解に基づいて選択肢を見ると、String[]型の配列を参照する変数としてObject型を使用する選択肢A「Object obj : array」が正しいとわかります。なぜなら、これによって二次元配列の一次元配列を一つずつ取り出すことができるからです。

以上の考え方で選択肢Aが正解であると簡単に導くことができます。

Top comments (0)