search
LoginSignup
5

More than 3 years have passed since last update.

posted at

updated at

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

メモ

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

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
What you can do with signing up
5