LoginSignup
5

More than 3 years have passed since last update.

プリミティブ型と参照型の違い

Last updated at Posted at 2019-06-26

メモ

プリミティブ型(基本データ型)と参照型

Javaの型は大きく分けて2種類あります。プリミティブ型参照型です。
それぞれについてまとめてみました。

プリミティブ型とは

以下の8つがプリミティブ型です。

分類 bit数
boolean 真偽値  1
byte 整数 8
short 整数 16
char 文字 16
int 整数 32
float 小数 32
long 整数 64
double 小数 64

プリミティブ型の変数宣言時は、宣言と同時に変数に値を格納できます。

以下の変数aには、そのまま1という値が格納されます。

int a = 1;

参照型とは

参照型は、上の8つ以外の型です。
例えば、Stringや配列などが参照型です。

Hoge hoge = new Hoge();
String str = "fuga";

参照型では変数に値はそのまま格納されず、値が格納されたメモリの場所を格納します。

再代入で見る基本型と参照型の違い

基本型と参照型では再代入での挙動で違いが出ます。

以下のサンプルコードは基本型の再代入しているコードです。こちらは直感的に分かると思います。

kihon.java
int a = 1;
int b = a; // bにはaの値:1が格納される
a = 2;

Systemout.println(a); // 2 が出力される
Systemout.println(b); // 1 が出力される

一方、参照型では以下のようになります。
基本型と同じような考え方では、b[0]は1を出力しそうな感じです。
ですが、参照型では変数に格納されるのはデータが格納されたメモリの場所だけです。

配列a宣言時、aには{1, 2, 3}という配列の情報が格納されたメモリの場所情報が格納されます。
配列b宣言時、bにもaのもつ{1, 2, 3}という配列のあるメモリ上の場所を格納します。

このとき、aもbも同じメモリの場所情報が入った変数となっています。

a[0] = 0;では、aに格納されたメモリの場所にある配列{1, 2, 3}の0番目の値を0に置き換えます。これでメモリ上に格納された配列は{0, 2, 3}となりました。

よって、bに格納されたメモリ上の場所から配列の0番目を見てみても、出力される値は0となります。

sansyo.java
int[] a = {1, 2, 3};
int[] b = a;
a[0] = 0;

Systemout.println(a[0]); // 0 が出力される
Systemout.println(b[0]); // 0 が出力される

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5