質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

5060閲覧

【Java】参照型変数の仕組みがよくわかりません

Atsuki_HONDA

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/08/14 11:11

###前提・実現したいこと
Java初心者です。以下のコードで5と出力される理由が理解できません。
ご教示いただけますと幸いです。
よろしくお願いいたします。

###該当のソースコード

Java

1public class Test{ 2 public static void main(String[] args){ 3 int[] a = new int[]{1,2,3}; 4 int[] b = a; 5 b[0] = 5; 6 System.out.println(a[0]); 7 } 8}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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言語ではクラスという概念が重要になりますが、ここではそれにはあえて触れませんでした。よろしくお願いします。

投稿2017/08/14 13:20

anndonut

総合スコア667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

int b = a;
とした時点で、bはaと同じ配列のことを指しています。
よって、aで行った変更は、同じ配列を見ているbに、bで行った変更は、同じ配列を指しているaにも適応されます。

もう一度いいますが、
bはaのコピーではなく、aと同じ配列を指しているのです。

投稿2017/08/14 11:43

Kakky7s

総合スコア122

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anndonut

2017/08/14 12:33

int b = a;は誤りで、int[] b = a;です。一応念のため。
Kakky7s

2017/08/15 00:49

すみません。抜けていました。 訂正ありがとうございます。
guest

0

参照型はメモリ上に保持している場所を指す値が代入されるので

{1,2,3}

が保持されてる場所を指す値がaには代入されます。
なのでaをbに代入したらその場所の値が入るので、
aとbは同じ配列を見てる状態になるわけです。

なのでここで
b[0] = 5;
としたら

メモリ上にあるaとbが見てる配列は
{5,2,3}
となるので。

a[0]を出力したときに5が表示されることになります。

投稿2017/08/14 12:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問