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]);
}

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/11/05 07:04:13
  • 終了:2011/11/05 17:16:40

ベストアンサー

id:a-kuma3 No.3

a-kuma3回答回数4605ベストアンサー獲得回数19432011/11/05 10:21:02

ポイント33pt

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(...);
	...
}

という感じになります。

他1件のコメントを見る
id:a-kuma3

あ、しまった。

c++ での new Button[10] に該当するものは java には無いんです、ということを、

書こうかどうか考えながら書いてたら、そっちの方を書いてしまいました X-(

2011/11/06 10:19:00
id:suzume_oyado

なるほど。なるほど。

とりあえず理解できました。

ありがとうございました。

2011/11/06 13:23:57

その他の回答(2件)

id:masarizum No.1

masarizum回答回数1ベストアンサー獲得回数02011/11/05 09:13:50

ポイント34pt

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

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

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

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

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

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

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

Button bt[] = new Button[10];

↑ではなくて、

Button[] bts = new Button[10];

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

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

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492011/11/05 09:23:04

ポイント33pt

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

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

 

言葉を変えると、

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

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

 

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

  Button bt[] = new Button[10];

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

  bt[i] = new Button(this);

id:a-kuma3 No.3

a-kuma3回答回数4605ベストアンサー獲得回数19432011/11/05 10:21:02ここでベストアンサー

ポイント33pt

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(...);
	...
}

という感じになります。

他1件のコメントを見る
id:a-kuma3

あ、しまった。

c++ での new Button[10] に該当するものは java には無いんです、ということを、

書こうかどうか考えながら書いてたら、そっちの方を書いてしまいました X-(

2011/11/06 10:19:00
id:suzume_oyado

なるほど。なるほど。

とりあえず理解できました。

ありがとうございました。

2011/11/06 13:23:57

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません