人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaの配列の使い方について教えてください。
入門書に↓のように書いてありました。
1行目でButtonのインスタンスを10個作ってそれを配列に格納しています。
なのにfor文の中で、またnewでインスタンスを作っています。
Javaではガーベージコレクションが働くそうですが、
そうであっても、冗長な気がします。
Javaの世界では、こういう書き方が一般的なのでしょうか?
(ちなみに、Andoroidアプリの開発入門書です。)

Button bt[] = new Button[10];

for (int i=0; i < bt.length; i++)
{
bt[i] = new Button(this);
bt[i].setText(Integer.toString(i));
ll.addView(bt[i]);
}


●質問者: suzume_oyado
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● masarizum
●34ポイント

1行目ではButtonインスタンスは作成されていません。

Button型の配列をサイズ10でメモリに確保しているだけです。

その後、ループの中で配列一つ一つに対してButtonインスタンスを作成しています。

最初のは、Buttonという型を持つ配列に対するnewで、

次に、Button自体のnewをしています。

同じButtonというキーワードに対してnewしているように見えますが、ここが違います。

ちなみに、この違いをもう少し分かり易くするため、配列を定義する際には

Button bt[] = new Button[10];

↑ではなくて、

Button[] bts = new Button[10];

と書くほうがよいと思いますよ。

どちらもJavaの文法的には正しいのですが。


2 ● うぃんど
●33ポイント

コンパイルする時に、型を特定できないと、

コンパイルエラーとなり、先に進めなくなります

言葉を変えると、

プログラマはthisがボタンであると知っているが、

コンパイラはそんなの知らないよという事です

そのため、まず入れ物としてbtを記述し、

Button bt[] = new Button[10];

thisも同じくButtonですよという形で記述します

bt[i] = new Button(this);


3 ● a-kuma3
●33ポイント ベストアンサー

Java は、プリミティブな型を除いて、参照しかありません。

配列ですら動的に確保する必要があります。

C や C++ で言うと、ある構造体(もしくは、クラス)の配列というのは存在せず、

その参照(ポインタ)の配列しかありません。


同じことを、C で書くと

struct Button ...

struct Button **bt = malloc(sizeof(struct Button*) * 10);

for (int i = 0 ; i < 10 ; i++)
{
 *(bt + i) = malloc(sizeof(struct Buttn));
...
}

C++ で書くと、

class Button ...

Button **bt = new Button[10];

for (int i = 0 : i < 10 ; i++)
{
*(bt + i) = new Button(...);
...
}

という感じになります。


suzume_oyadoさんのコメント
あれ…。記入したと思った回答が消えてる…。 再記入します。 ↑ので一旦、理解した気がするのですが、C++の方は Button* buttons = new Button[10]; ↑こうな気がします。 これ一行で、インスタンスも確保されてコンストラクタで呼ばれると思います。 あ。と、ここまで書いて…。 Button** buttons = new Button*[10]; こうですね。 納得しました!

a-kuma3さんのコメント
あ、しまった。 c++ での new Button[10] に該当するものは java には無いんです、ということを、 書こうかどうか考えながら書いてたら、そっちの方を書いてしまいました X-(

suzume_oyadoさんのコメント
なるほど。なるほど。 とりあえず理解できました。 ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ