オブジェクトラッパー
各タイプと呼ばれる対応する基底クラス有するwarpperラッパー。
/* extends Number */
// Interger <-> int
// Long <-> long
// Float <-> float
// double <-> double
// Short <-> short
// Byte <-> byte
/* not extends Number */
// Character <-> character
// Void <-> void
// Boolean <-> boolean
物体を包装することである不変:ラッパーの構成後、パッケージングは、その中に値を変更することが許可されていません。
オブジェクトのラッパーがあるfinal
:オブジェクトの定義は、ラッパーのサブクラスにすることはできません。
オートボクシング(オートボクシング)
宣言Integer
配列リストオブジェクトをと3人の値を追加Integer
するオブジェクトを。
// 由于值包装在对象中,ArrayList<Integer>的效率远低于int[]数组。
ArrayList<Integer> list = new ArrayList<>();
// 等价于list.add(Integer.valueOf(3));
list.add(3);
逆に、Integer
オブジェクトが割り当てられているint
時間変数、それは意志自動的にアンパック。
// 编译器将以下语句翻译成int n = list.get(i).inValue();
int n = list.get(i);
これは、算術式で自動的にボクシングとアンボクシングすることができます。
Integer n = 3;
// 编译器会自动地插入一条对象拆箱指令,在自增计算执行后,执行装箱指令。
n++;
ラッパーの比較
オブジェクトラッパー平等異なる基本タイプと:
Integer a = 1000;
Integer b = 1000;
// ==检测a和b是否指向同一个存储区域,结果是false
System.out.println(a == b);
// equals方法比较a和b包装的值,结果是true
System.out.println(a.equals(b));
:そこ値の基本的な種類の範囲の自動包装仕様はboolean
、byte
、char
≤ 127との間の、-128〜127の間short
とint
同じメモリ領域を指し固定物に充填されます。
Integer a = 100;
Integer b = 100;
// 此时a和b指向同一个存储区域,结果是true
System.out.println(a == b);
異常はnull参照
ヌルシテ包装、オートボクシングを投げることがありNullPointerException
、例外を:
Integer n = null;
// 由于n引用null,执行2 * n时会将n自动拆箱取值,抛出NullPointerException异常。
System.out.println(2 * n);
自動アップグレード
また、条件式を用いて混合Integer
し、Double
時にInteger
値が昇格アンパックdouble
、その後、として包装Double
:
Integer n = 1;
Double x = 2.0;
// n升级为Double,结果是1.0
System.out.println(true ? n : x);
注:ボクシングとアンボクシングがあるコンパイラの代わりに仮想マシンの認識します、。コンパイラは、バイトコードのクラスを生成し、その後、必要なメソッド呼び出しを挿入します。