単二電池

1週間ほど前からJavaを独学している者です。
C言語をその前からやっていて、初心者レベル程度ならわかると思います。
そこで、質問です。

C言語の配列宣言:
  int array[10];

Javaの配列宣言:
  int array[] = new int[10];

二つの言語とも、要素10個のarray1次元配列変数を宣言していると思います。
C言語の書き方はシンプルなので、納得がいきますが、Javaの方はどうしてこの形で宣言をするのかわかりません。(自分が言語製作者ならシンプルな書き方を採用します)
だから、このような宣言の方法をとるということは何か理由があるのだと思います。

自分が思うところ、JavaはC言語より、柔軟で多機能だとおもうので、その影響で汎用性をますために、
長くなっているのかな~?と思っています。
こんごJavaの学習を進めていくと、例えば、
  int array[] = new double[10]; //←エラーになりました
みたいに型のちがう、宣言が出てきたりするのでしょうか?

ちらっと、学習に使っている本をみたところ、動的配列の作成は別の操作で実現しているようなので、
「動的とは関係ないのかな?」と思っています。

長くなりましたが、Javaの配列宣言のメリットを教えてください。

A 回答 (4件)

Javaは,次の2つによって配列を実現しているから。



+―+ +―+―+―+―+―+―+―+―+―+―+
|●|→|■|■|■|■|■|■|■|■|■|■|
+―+ +―+―+―+―+―+―+―+―+―+―+

●int[] array;
「int型の一次元配列を指すための参照。
 変数名arrayは与えられているが,どの一次元配列も指してはいない」

■new int[10];
「10個分確保されたint型の一次元配列。
 領域はあるが変数名によって指し示されていないので参照できない」

そして両者を連結しているのが「=」演算子です。

arrayそのものが配列だ,というイメージを持っていると
int array[] (「arrayという配列」はintデータ型だ)
というコードを書きたくなるのでしょうけれど
(この書き方も認めていますのでエラーにはなりません),

array自体が配列なのではなく,arrayは配列を指す参照なのだ,
というイメージを持っていれば,
int[] array(arrayは「intの配列」を指すデータ型だ)
というコードの方がしっくりくると思います。

--------
発展として。
Javaにおける二次元配列は
「参照が指し示す一次元配列の各要素が参照する一次元配列」
として実現していますから,
3×3の二次元配列を省略書式を用いずにコーディングすると
次のようになります。

int[][] array;
array = new int[3][];
array[0] = new int[3];
array[1] = new int[3];
array[2] = new int[3];

(この回答の冒頭に掲げた図を真似て,この5行の様子をイラストで描けますか?)
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。

>array自体が配列なのではなく,arrayは配列を指す参照なのだ,
この宣言によって、arrayがどのように定義されたのかわかった気がします。

宣言のイメージを大切にしたいので、これからは
 int[] array = new int[10];
という宣言をしたいと思います。

--------

>(この回答の冒頭に掲げた図を真似て,この5行の様子をイラストで描けますか?)
自身はないのですが、このような感じですか?
● → ■ ■ ■
    ↓ ↓ ↓
    □ □ □
    □ □ □
    □ □ □

■と□,□,□の関係は●と■,■,■の関係と同じです。

お礼日時:2013/04/10 21:02

> 普通のオブジェクトを作る文法とは大きく違いますよね?


> Stringクラスは”特別”ってことなのでしょうが。

そうですね,
文字列は多用するので簡潔な書き方を認めているということでしょう。

----------------
Javaの入門書には必ず載っているであろうサンプルコードがこちら。

String s1 = "文字列";
String s2 = new String("文字列");
String s3 = "文字列";
System.out.println(s1 == s2); //偽(false)
System.out.println(s1 == s3); //真(true)

.equals()を用いていない例なので,
比較しているのは文字列の中身ではなく,文字列の格納位置。
すなわち,s1, s2, s3 という「参照」の内容を比較している。

「new String("文字列")」でコーディングすると,
新たな領域を確保して文字列を格納してくれるけれど,
「"文字列"」でコーディングすると
同じ文字列がすでに登場しているならそれを共用・再利用しようとする。

参照と,それが指し示す文字列の関係は,次のようになります。

+―+ +―――+
|s1|→|文字列|
+―+ +―――+
+―+ ↑
|s3|/
+―+

+―+ +―――+
|s2|→|文字列|
+―+ +―――+

----------------
> 自身はないのですが、このような感じですか?
> ● → ■ ■ ■
>     ↓ ↓ ↓
>     □ □ □
>     □ □ □
>     □ □ □

はい,正しく理解なさっていると思います。
    • good
    • 0
この回答へのお礼

返答に時間が開いてしまい申し訳ありません。
詳しくご説明ありがとうございます。

文字列比較の「真」になったり「偽」になるのは、本にも書かれていましたが、条件比較の仕組みまでは知りませんでした。
ためになりました。

お礼日時:2013/04/13 08:23

Java だと


int array[] = new int[10];
より
int[] array = new int[10];
の方がふつうじゃないか?
で C の
int array[10];
では array の型は int[10]. 一方 Java の
int[] array = new int[10];
のとき array の型は int[]. どっちがわかりやすい?

ちなみに
int array[] = new double[10];
はエラーになるけど
Object[] array = new Integer[10];
はエラーにならなかったりする.
    • good
    • 0
この回答へのお礼

やさしくご回答ありがとうございます。

>int[] array = new int[10];の方がふつうじゃないか?
Googleの検索結果でも、int[] array = new int[10];の書き方の方が多かったです。

>Object[] array = new Integer[10];
Objectクラスというものがはっきり掴めてなく、「なるほど!」となりませんでしたが、これから学習していく時は、このことを頭の片隅において進めて行きたいと思います。

お礼日時:2013/04/10 21:13

>長くなりましたが、Javaの配列宣言のメリットを教えてください。



メリットとかではなく配列というオブジェクトなだけです。
    • good
    • 0
この回答へのお礼

卒直なご回答ありがとうございます。

>メリットとかではなく配列というオブジェクトなだけです。
「オブジェクトと捉えればよかったのか~」と思いました。(new演算子もついてますし・・・)

でも、配列のようにプログラミングに不可欠な存在の宣言って変わってますよね。Javaの文字列宣言の、
String str = "文字列";
↑これも、普通のオブジェクトを作る文法とは大きく違いますよね?Stringクラスは”特別”ってことなのでしょうが。

お礼日時:2013/04/10 20:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!