頭脳一式

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

【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クラスとは

プリミティブ型をラップするクラスの総称。
int、char、booleanといったプリミティブ型をオブジェクトとして扱うクラスのこと。
プリミティブ型と対応するラッパークラスのオブジェクトを作成し、
そのオブジェクトに対して用意されたメソッドを利用することでプリミティブ型の値を操作することができる。

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型への変換の際にはキャスト不要。
}