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の配列宣言のメリットを教えてください。
No.3ベストアンサー
- 回答日時:
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行の様子をイラストで描けますか?)
丁寧なご回答ありがとうございます。
>array自体が配列なのではなく,arrayは配列を指す参照なのだ,
この宣言によって、arrayがどのように定義されたのかわかった気がします。
宣言のイメージを大切にしたいので、これからは
int[] array = new int[10];
という宣言をしたいと思います。
--------
>(この回答の冒頭に掲げた図を真似て,この5行の様子をイラストで描けますか?)
自身はないのですが、このような感じですか?
● → ■ ■ ■
↓ ↓ ↓
□ □ □
□ □ □
□ □ □
■と□,□,□の関係は●と■,■,■の関係と同じです。
No.4
- 回答日時:
> 普通のオブジェクトを作る文法とは大きく違いますよね?
> 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|→|文字列|
+―+ +―――+
----------------
> 自身はないのですが、このような感じですか?
> ● → ■ ■ ■
> ↓ ↓ ↓
> □ □ □
> □ □ □
> □ □ □
はい,正しく理解なさっていると思います。
返答に時間が開いてしまい申し訳ありません。
詳しくご説明ありがとうございます。
文字列比較の「真」になったり「偽」になるのは、本にも書かれていましたが、条件比較の仕組みまでは知りませんでした。
ためになりました。
No.2
- 回答日時:
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];
はエラーにならなかったりする.
やさしくご回答ありがとうございます。
>int[] array = new int[10];の方がふつうじゃないか?
Googleの検索結果でも、int[] array = new int[10];の書き方の方が多かったです。
>Object[] array = new Integer[10];
Objectクラスというものがはっきり掴めてなく、「なるほど!」となりませんでしたが、これから学習していく時は、このことを頭の片隅において進めて行きたいと思います。
No.1
- 回答日時:
>長くなりましたが、Javaの配列宣言のメリットを教えてください。
メリットとかではなく配列というオブジェクトなだけです。
卒直なご回答ありがとうございます。
>メリットとかではなく配列というオブジェクトなだけです。
「オブジェクトと捉えればよかったのか~」と思いました。(new演算子もついてますし・・・)
でも、配列のようにプログラミングに不可欠な存在の宣言って変わってますよね。Javaの文字列宣言の、
String str = "文字列";
↑これも、普通のオブジェクトを作る文法とは大きく違いますよね?Stringクラスは”特別”ってことなのでしょうが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaのプログラムについて コマ...
-
【C#】ハッシュテーブル(連想...
-
半角カナの判別方法
-
0から99の数字をランダムに...
-
配列をセッションに割り当てた後で
-
ページング
-
javamailで複数人にメールを送...
-
動的配列確保
-
java
-
CSVファイルの、列だけ取得したい
-
配列で、値の入っている要素数...
-
配列について
-
java HashMapのキーをkeySet()...
-
Javaで文字を漢字であるか否か...
-
[Ljava.lang.Stringってなんですか
-
無名配列の作成方法について質問
-
C言語でunsigned char配列を連...
-
すでに昇順になっている配列
-
配列数を超えてアクセスしたと...
-
C#で動的配列Listの中身をListB...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ページング
-
[Ljava.lang.Stringってなんですか
-
【C#】ハッシュテーブル(連想...
-
配列で、値の入っている要素数...
-
C言語でunsigned char配列を連...
-
Javaで文字と数字が混ざったも...
-
この警告はどうすれば?
-
C#で動的配列Listの中身をListB...
-
配列の中に複数存在する数がい...
-
javamailで複数人にメールを送...
-
同じ配列またはクラスを、2回...
-
csvファイルを2次元配列に格納
-
ArrayListからBean配列に値をセ...
-
javaで大容量テキストファイル...
-
main(String[] args) の args...
-
【Ajax通信&Java】配列の受け取...
-
java
-
『args[]』とは?
-
配列をセッションに割り当てた後で
-
Javaで文字を漢字であるか否か...
おすすめ情報