Javaの入門書で、ある程度信頼できるものを隅から隅まで読めばわかることではありますが、いくつかのウィークポイントが絡んでいて、理解できてないのだと思います。
まず、変数aと変数bの中には1, 2, 3という数字のいずれも格納されていません。
int[] aとかint[] bと書いてあるので紛らわしいのですが、aもbも{1, 2, 3}そのものではないのです。
new int[]{1,2,3}というのは、int型のデータが3個入る箱(正しくは、長さ3のint型配列)を、実行しているプログラムが使っているメモリ領域のどこか(これをヒープ領域といいます)に確保するという意味です。
ただ、メモリ領域のどこに、その箱があるかが分からないと、その箱にデータを入れることも出すこともできないので、その「場所」をaに代入しているのです。Java言語ではこれを、「変数aが配列オブジェクトを参照する」という言い方をします。
そして、変数bもまた、変数aと同じように配列オブジェクトを参照するためのものです。
int[] b = a; というのは、実は、int[] b; と b = a; という2つの文に分けることができます。
int[] b; とすることで、変数bをint[]型の変数として宣言します。宣言しなければならない理由は、変数に違う型のデータを代入できなくするためです。変数に違う型のデータを代入できるようにするとプログラムのバグが発生しやすくなるので、わざわざ宣言をさせているのです。そして、当然変数bも、箱そのものではなく、「場所」を格納するためのものです。
b = a; と書くことで、変数bが示す場所は変数aが示す場所と同じになります。Java言語ではこれを、「変数bと変数aは同じ配列オブジェクトを参照している」といいます。
ではなぜ、変数aやb自体に配列オブジェクトのデータを格納しないのでしょうか?それは、配列というものが大きいデータだからです。intやdoubleなどの「数値」に比べると、大きくなる傾向にあります。また、配列のサイズも最初に自由に決めることができます。なので、とりあえず「どこか」にメモリを確保して、その「場所」を変数に控えておけばプログラムの実行効率が上がるというわけです。
intやdoubleなどの型はプリミティブ型といいます。データ型、基本データ型ともいうことがあります。プリミティブ型は小さなデータを扱うための型なので、そのデータ自体を変数に代入します。
つまり、int c = 3; というのは、変数cをint型として宣言し、int型のデータである3自体を変数cに格納します。
プリミティブ型以外の型は参照型といいます。それは、new演算子などでオブジェクトと呼ばれるデータをヒープ領域に確保し、そのオブジェクトを変数が参照するのでそのように呼びます。
すみません。この解説は、今回の疑問に答えるためのものであり、端折った説明になっています。Java言語ではクラスという概念が重要になりますが、ここではそれにはあえて触れませんでした。よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。