0
0

Javaの値型(基本データ型、プリミティブ型)と参照型(オブジェクト型)の違い

Posted at

値型(プリミティブ型、基本データ型)と、参照型(オブジェクト型)の違い

値型(プリミティブ型)
基本データ型
参照型
(オブジェクト型)
intとか Integerとか
頭文字 小文字 大文字
特徴 ・変数に「値」そのものを持つ
・変数のサイズ(bit)が決まっている
 ・既定サイズを超える値を格納することはできない
 ・適切な型を使わないと無駄にメモリを使う
・何のメソッドも持たない
(「int.メソッド名」とかのドット演算子でメソッドを呼び出せない)
・オブジェクトではなく単なる値
・変数には「値」そのものではなく、値がメモリのどこに格納されているかを示す「参照値」が格納される

※基本データ型=値型(プリミティブ型)
 ↑言い方が違うだけで同じもの

ラッパークラス(wrapper class、プリミティブラッパークラス)

値型(プリミティブ型)の特徴に

何のメソッドも持たない
オブジェクトではなく単なる値

があった
しかし
プログラムの中では値型(プリミティブ型)の値に対する操作(文字列との相互変換など)が必要になる場面がたくさんあり、このままだと困るヽ(´Д`; ≡ ;´Д`)丿オロオロ

_人人人人人人_
>  そこで  <
 ̄Y^Y^Y^Y^Y ̄

Javaは値型(プリミティブ型)の補助的な役割として値をオブジェクトとして扱えるように、ラッパークラスを用意している
↓こうゆうやつ
Integer.valueOf(int i); // 指定されたint型を表すIntegerクラスのインスタンスを返す

表1 プリミティブ型と対応するラッパークラス

値型(プリミティブ型) ラッパークラス
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
char java.lang.Character
float java.lang.Float
double java.lang.Double
boolean java.lang.Boolean
meが間違えたこと 誤:ラッパークラスは、オブジェクト型を定義している
正:ラッパークラスは、参照型(オブジェクト型)に分類される
  値型(プリミティブ型)の進化系クラス

値型と参照型を実装で見てみると

以下の①②③は同じ意味

Integer test = 1; // 「1」はたぶんint型
↑ ・String型はコレ
 ・コンストラクタを使ってインスタンスの作成をしているの(←②の書き方)と同じことをしている
Integer test = new Integer(1); // コンストラクタを使ってインスタンスの作成をしている
↑このコンストラクタを使って宣言をする方法は、Java9から非推奨となり、静的メソッド(←③の書き方)を使うことが推奨されている
Integer test = Integer.valueOf(1); // 静的メソッド、「1」はint型
↑静的メソッド=newでインスタンスを作らなくても使える

参考資料

コンストラクタ
Integer​(int value)
非推奨。
このコンストラクタを使用することはめったに適切ではありません。 静的ファクトリvalueOf(int)は、より良い選択肢です。スペースと時間のパフォーマンスが大幅に向上する可能性が高いためです。

Java本格入門
~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで
谷本心,阪本雄一郎,岡田拓也,秋葉誠,村田賢一郎 著、Acroquest Technology株式会社 監修
68、69頁

0
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
  3. You can use dark theme
What you can do with signing up
0
0