頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?というスタンスで最強のナレッジベースを目指すブログ

【Java】プリミティブ型と参照型の違い。wrapperクラスとは

プリミティブ型

プリミティブ型とは値そのものを保持することを指します。
つまり、プリミティブ型の変数は値を保持するものなのでnullは代入できません。
Javaにおけるプリミティブ型は以下のとおりです。

プリミティブ型(基本データ型) wrapperクラス superクラス
boolean Boolean Object
char Character Object
byte Byte Number
short Short Number
int Integer Number
long Long Number
float Float Number
double Double Number

参照型

参照型はオブジェクト型、列挙型、配列型など、インスタンスへの参照を指します。

wrapperクラスとは

プリミティブ型をラップするクラスの総称です。
プリミティブ型は単に値を保持しているだけに過ぎないので、プリミティブ型自身はメソッドを持ちません。
しかし、処理の中で、プリミティブ型の値に対して何らかの操作をしたい場面があると思います。
(文字列へ変換したり…)
そういった要望を実現するため、プリミティブ型を操作するための機能を備えたwrapperクラスというものがあります。
wrapperクラスは、int、char、booleanといったプリミティブ型の値を内包し、オブジェクトとして扱うことができます。
プリミティブ型と対応するwrapperクラスのオブジェクトを作成し、
そのオブジェクトに対して用意されたメソッドを利用することでプリミティブ型の値を操作することができます。

wrapperクラスの特徴はキャスト宣言せずにプリミティブ型に戻せることです。
この仕組を「オートボクシング」と呼びます。
以下の両パターンが書けます。

int i2  = (int) Integer.valueOf("100");
int i3  = Integer.valueOf("100");//キャストを省略できる。

プリミティブ型のキャスト

public static void main(String[] args) {
  char    ch = 79;
  long    a = 100;
  int     b = 10;
  short   c = 20;
  byte    d = 1;
  double  f = 20.0;
  float   e = 10.0f;

  //基本的に、大きい型の変数に小さい型の値を代入するときはキャスト不要。
  //小さい型の変数に大きい型の値を代入しようとするときにキャストが必要になる。
  //整数型(long,int,short,byte)の変数に浮動小数点型の変数の値を代入するときはキャストが必要になる。
  //char型に代入する場合は、どのような型であってもキャストが必要。
  a = (long) f;
  b = (int) e;
  c = (short) f;
  d = (byte) e;
  ch = (char) b;

  //double型とfloat型の場合は、double型が64bitでfloat型より大きいので、
  //「float型の変数にdouble型の値を代入するときはキャストが必要になる。」
  e = (float) f;
  f = e;//float型からdouble型への変換の際にはキャスト不要。
}