Javaのプリミティブ型と参照型について

Javaのプリミティブ型と参照型の違いについて理解したのでメモ。

型の種類

Javaの変数には、大きく分けて以下の2つの型が存在します。

  • プリミティブ型
  • 参照型

プリミティブ型

データを格納するための、最も基本的な型です。整数値や実数値といった、具体的な「値」を格納するための変数を作るための型がプリミティブ型です。

Javaにおけるプリミティブ型は以下のものが存在します。

  • byte
  • short
  • int
  • long
  • char
  • float
  • double
  • boolean

プリミティブ型は頭が小文字です。

参照型

クラスのインスタンスを指し示す「番号」もしくはその番号を格納するための変数を「参照」と言います。クラスはnewを用いてインスタンスを作成しなければ使用できませんが、そのインスタンスは直接操作することができません。インスタンスの作成時に「参照」と呼ばれる「番号」が振られて返されます。インスタンスを操作する為にはこの番号を用いてインスタンスを「参照」し、操作しなければなりません。その「参照」を受け取るのが「参照型」というわけです。

以下は、プリミティブ型をラップしている「ラッパークラス」と呼ばれるものです。「ラッパークラス」とは、プリミティブ型をクラスの中に梱包したもので、Javaの代表的な参照型です。

プリミティブ型 ラッパークラス
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

参照型は頭が大文字です。

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

プリミティブ型と参照型の違いをまとめてみます。

変数へ値を代入したときに渡されるもの

プリミティブ型では、そのままの値が渡されます。

参照型では、「参照」と呼ばれる番号が渡されます。

比較するとき

プリミティブ型では、==による比較ができます。

参照型では、==で比較すると、「参照」という番号同士を比較してしまうので、.equals()を使用して比較します。

コピーするとき

コピー方法は2つに大別されます。値をコピーすることをディープコピー(深いコピー)、参照をコピーすることをシャローコピー(浅いコピー)と呼びます。

プリミティブ型では、a = bのように代入による値のコピーができます。これはディープコピーです。

参照型では、a = bのようにコピーすると「参照」をコピーしてしまい、aとbは同じインスタンスを指し示すようになります。これはシャローコピーです。

もし、参照型でディープコピーを行いたいときは、cloneメソッドを実装して使用します。

オートボクシング

オートボクシングとは、プリミティブ型と参照型を双方向に暗黙的に変換する機能です。プリミティブ型を参照型に変換することをボックス化(boxing/ボクシング)と呼びます。逆に、ボックス化された参照型をプリミティブ型に戻すことをボックス化解除(unboxing/アンボクシング)と呼びます。

以下のコードでは暗黙的にオートボクシングが行われています。

ボクシング(ボックス化)の例

int numInt = 10;
Integer numInteger = numInt;

アンボクシング(ボックス化解除)の例

Integer numInteger = new Integer(10);
int numInt =  numInteger;

参考
読本Java/4.6 プリミティブ型と参照型 – WisdomSoft
値渡しと参照渡し (と参照の値渡し) – ぐるぐる~
10-8. ラッパークラス – マンガで分かる Java入門講座 – マンガPG
図解 javaは参照渡しではなく参照の値渡しであるという事 – 蟻の実験工房(別館ラボ)
プリミティブ型とは : JavaA2Z
参照とは : JavaA2Z