Javaのプリミティブ型と参照型


Javaの型はプリミティブ型と参照型の2種類に分類されます。この紹介です。


  • プリミティブ型(基本データ型)
    • 変数はデータそのものを表し、振る舞いは持ちません
    • 例: byte, short, int, long, float, double, char, boolean
  • 参照型
    • 変数はオブジェクトをッシ示す参照が代入されます
    • newを用いてインスタンスを作成する必要があります
    • 例: Byte, Short, Integer, Long, Double

🍮 デフォルト初期値

インスタンスフィールド変数と配列構成要素は型に応じて初期値を持ちます。

オプション 説明
参照型 null
boolean false
char ¥u0000
byte, short, int, long 0
float, double 0.0

ローカル変数の場合はデフォルト初期値を持たず、未初期化の変数を使うとコンパイルエラーになります。

🎃 参照型と変数の関係

参照型では変数はオブジェクトの参照(オブジェクトの位置情報)を持ち、変数の名前でオブジェクトにアクセスできます。
下図は概念図です。

出典:改訂2版 パーフェクトJava

🚜 変数の型とオブジェクトの型の規則

変数の型はその変数が参照するオブジェクトに対してどんな操作ができるかを確定します。
オブジェクトの型は呼ばれた先の実際の動作を確定します。

  • 変数とオブジェクトの型が一致していれば、オブジェクトの参照を変数に代入できる
  • 変数が参照するオブジェクトに対して行える操作は変数の型で決まる
  • P型と継承したC型の場合、P型の変数にC型のオブジェクトの参照を代入できる
  • C型のオブジェクトはP型のもつメソッドがあることを保証する

出典:改訂2版 パーフェクトJava

👽 Nullチェック関連メソッド

オプション 説明
boolean equals(Object a, Object b) 引数のどちらかがnullでも使える同値比較
String toString(Object o, String nullDefault) nullの場合指定した文字を返す
boolean isNull(Object o) 引数がnullのときに真
boolean nonNull(Object o) 引数がnullでないときに真
T requireNonNull(T obj) 引数がnullだと即座にNullPointerExceptionを発生

🐡 オートボクシング / アンボクシング

プリミティブ型からラッパの参照型への自動変換を「オートボクシング」と呼びます。

int intNumber = 10;
Integer integerNumber = intNumber;

逆にラッパの参照型からプリミティブ型への自動変換を「アンボクシング」といいます。

Integer integerNumber = new Integer(10);
int intNumber = integerNumber;

🤔 参照型にはnullが入る可能性がある

参照型の特徴のひとつとしてnullをもつことができます。プリミティブ型はnullをもつことができません。

Integer integerNumber = null;
int intNumber = integerNumber; // NullPointerException が発生

🐝 参照型オブジェクトの比較

比較演算子は変数のデータをもとに比較を行うため、参照型の参照アドレスでは比較演算子による比較ができません。
参照型オブジェクトの比較には、Object#equals()Object#hashCode()を用います。

  • Object#equals() : オブジェクトどうしを比較し、同じかを判断する
  • Object#hashCode() : オブジェクトを一意に表す整数型を生成する

🚕 プリミティブ型(基本データ型)の型変換

暗黙型変換

byte値をint型に代入したり、float値をdouble型に代入する場合、暗黙的に型変換が行われます。
扱える範囲の大きな型に変換する場合は暗黙的に行うことができます。

byte => short => int => long => float => double
char => int => long => float => double

キャストによる型変換

int型をbyte型の変数に代入したり、double値をfloat型の変数に代入する際はキャスト(変換したい型) 変数が必要です。

double => float => long => int => short => byte
double => float => long => int => char

🐠 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)