これは jdk1.5 以降に導入された新しいコンテンツです。私は公開することが最高の思い出であると主張するため、思い出をブログに置き換えることにしました。
Java 言語仕様には、次のように記載されています。 多くの場合、パッケージ化とアンパックはコンパイラ自体によって行われます (この場合、パッケージ化はボックス化と呼ばれ、アンパック化はアンボックス化と呼ばれます)。
実際、私自身の理解によれば、自動ボックス化は、Java のオブジェクト指向に準拠するために、基本的なデータ型をオブジェクト型にカプセル化することとして単純に理解できます。例として int を使用します。
次のようにコードをコピーします。
//Integer オブジェクトを宣言する
整数番号 = 10;
//上記のステートメントは自動ボックス化を使用しています。次のように解析されます。
Integer num = new Integer(10); 上記は良い例です。10 は基本的なデータ型に属しているため、原則としてオブジェクト Integer に直接割り当てることはできませんが、jdk1.5 以降ではこのステートメントを実行できます。これは、基本データ型を対応するカプセル化された型に自動的に変換するオートボクシングの魅力です。オブジェクトになった後は、オブジェクトによって宣言されたすべてのメソッドを呼び出して、オブジェクトを自動的にアンボックス化できます。したがって、オブジェクトを基本データ型に再変換することを意味する名前が付けられています。
//ボクシング
整数番号 = 10;
// ボックス化を解除する
int num1 = num; 自動アンボックス化の非常に一般的な使用法は、演算を実行するときです。オブジェクトは直接操作されず、加算、減算、乗算、および除算を実行する前に基本データ型に変換する必要があるためです。
整数番号 = 10;
// 自動アンボックス化は計算実行時に暗黙的に行われます
System.out.print(num--); ははは、とても簡単に感じられるはずです。ここからはもう少し難しい話をします。
//-128~127以外の数値
整数 num1 = 297; 整数 num2 = 297;
System.out.println("num1==num2: "+(num1==num2));
// -128~127以内の数値
整数 num3 = 97; 整数 num4 = 97;
System.out.println("num3==num4: "+(num3==num4)); 出力される結果は次のとおりです。 num1==num2: false num3==num4: true
奇妙なことに、これは Java の Integer と int の自動ボックス化およびボックス化解除の設計によるものです。これはフライウェイト モード (flyweight) と呼ばれるモードです。
単純な数値の再利用を増やすために、Java は次のように定義します。 自動ボックス化中、128 から 127 までの値については、整数オブジェクトにボックス化された後、それらは再利用のためにメモリに保存され、常に 1 つだけ存在します。オブジェクトが 128 から 127 の間の値を超える場合、ボックス化された Integer オブジェクトは再利用されません。これは、ボックス化されるたびに新しい Integer オブジェクトが作成されることと同じです。上記の現象は、Caused by の使用によるものであることを理解してください。オートボックス化。オートボックス化を使用せず、一般クラスと同様にインスタンス化に new を使用する場合、新しいオブジェクトが作成されるたびに新しいオブジェクトが作成されます。
この自動ボックス化とボックス化解除は、基本的なデータ型だけでなく、たとえば String オブジェクトを宣言する場合にも使用されます。
次のようにコードをコピーします。
文字列 str = "sl";
//以下の宣言メソッドを置き換えます
文字列 str = 新しい文字列("sl");
基本データ(Primitive)型のオートボックス化およびアンボックス化は、J2SE 5.0から提供される機能です。基本的なデータ型をパッケージ化すると便利ですが、詳細が隠蔽されるため、基本的なデータ型とオブジェクトの違いを区別できる場合にのみ使用することをお勧めします。
自動ボックス化とボックス化解除
Java では、処理されるものはほとんどすべてオブジェクト (Object) です。たとえば、前に使用したスキャナーもオブジェクトです。後ほど説明します。ただし、基本データ型はオブジェクトではありません。つまり、int、double、boolean などを使用して定義する変数や、直接書き込むリテラル定数です。
前のセクションでは、オブジェクト操作の便利さを大まかに見てきましたが、Java をしばらく使用したことがある人なら、基本的なデータ型をオブジェクトに変換する必要がある場合があることを知っています。たとえば、Map オブジェクトの put() メソッドを使用する場合、渡す必要があるパラメータは、基本データ型ではなくオブジェクトです。
基本的なデータ型をオブジェクトにラップするには、ラッパー型 (ラッパー型) を使用する必要があることはすでにわかりました。J2SE 5.0 より前では、次のステートメントを使用して int を Integer オブジェクトにラップする必要があります。 Integer integer = new整数(10) ;
オートボクシング機能は、J2SE 5.0 以降で提供されます。次のステートメントを直接使用して、基本データ型をパックできます。
コンパイル時に、コンパイラーは、作成したステートメントに基づいて自動ボックス化を実行するかどうかを自動的に決定します。上記の例では、integer は Integer クラスのインスタンスを参照します。同じアクションを、boolean、byte、short、char、long、float、double などの基本データ型に適用できます。対応するラッパー タイプ (ラッパー タイプ) Boolean、Byte、Short、Character、Long、Float、Double は、それぞれ使用されます。オートボクシング関数を直接使用して、例 4.4 を書き換えてみましょう。
例4.5 AutoBoxDemo.java
次のようにコードをコピーします。
パブリック クラス AutoBoxDemo {
public static void main(String[] args) {
整数データ 1 = 10;
整数データ 2 = 20;
//double 値に変換して 3 で割ります
System.out.println(data1.doubleValue() / 3);
// 2 つの値を比較します
System.out.println(data1.compareTo(data2));
}
}
プログラムははるかに単純に見えます。data1 と data2 は実行時に Integer のインスタンスであり、オブジェクト操作を直接実行できます。結果は次のとおりです。
3.3333333333333335
1
自動ボクシングを使用する方法は次のとおりです。
次のようにコードをコピーします。
int i = 10;
整数 整数 = i;
より一般的な java.lang.Number クラスをオートボックス化に使用することもできます。例えば:
数値数値 = 3.14f;
3.14f は自動的に Float としてボックス化され、number に割り当てられます。
J2SE 5.0 以降、自動ボックス化および自動アンボックス化が利用可能になりました。つまり、オブジェクト内の基本的なデータ形式情報がオブジェクトから自動的に取り出されます。たとえば、次のように書くことができます。
次のようにコードをコピーします。
整数 fooInteger = 10;
int fooPrimitive = fooInteger;
fooInteger が Integer として自動的にボックス化されるインスタンスを参照した後、それが int 型の変数 fooPrimitive に割り当てられると、自動的に int 型に変更されてから fooPrimitive に割り当てられます。動作中に、自動ボックス化およびボックス化解除も実行できます。例えば:
次のようにコードをコピーします。
整数 i = 10;
System.out.println(i + 10);
System.out.println(i++);
上記の例では、20 と 10 が表示されます。コンパイラーは自動的にボックス化とボックス化解除を実行します。つまり、10 が最初にボックス化され、次に i + 10 のときに最初にボックス化解除され、i++ の加算演算が実行されます。行も最初にボックス化されてから、インクリメント操作が実行されます。別の例を見てみましょう。
次のようにコードをコピーします。
ブール値 boo = true;
System.out.println(boo && false);
同じ boo は元々 Boolean のインスタンスです。AND 演算を実行すると、最初に boo がボックス化されず、次に false と AND 演算され、結果は false と表示されます。
//////////////////////////////////////////////// /// /////////////////
ボックス化: 基本型からオブジェクト型への変換はボックス化と呼ばれます。 ***アンボックス化: オブジェクトから基本型への変換の操作はアンボックス化と呼ばれます。 この操作は反映プロセスでよく使用されます。
パッキング: ヒープ内にオブジェクト インスタンスを作成し、指定した値をコピーします。 ***アンボックス化: 参照が指すヒープ内の情報が分割するタイプであるかどうかを判断し、ヒープから値を取得して送信します。それをスタック変数に追加しないと、例外が報告されます。
//////////////////////////////////////////////// /// //////////////////
ボックス化は、値型をオブジェクト型、またはその値型が実装するインターフェイス型への隠者型変換です。
値型をボックス化すると、オブジェクト インスタンスが割り当てられ、その値が新しいオブジェクトにコピーされます。
次のようにコードをコピーします。
int i=123;
オブジェクト o=i;
この文の結果は、ヒープ上の int 型の値を参照するオブジェクト o をスタック上に作成することになります。この値は変数 i に代入されます
値型の値のコピー。
以下はボクシング変換を実行する表示です
次のようにコードをコピーします。
int i=123;
オブジェクト o=(オブジェクト)i;
この例では、ボックス化を通じて整数変数 i をオブジェクト o に変換します。このようにして、変数 i に格納される値は 123 から 456 に変化します。この例は、オブジェクトがコンテンツの元のコピーを保持していることを示しています。つまり123です。
アンボックス化は、オブジェクト型から値型へ、またはインターフェイス型からインターフェイスを実装する値型への明示的な変換です。開梱操作には次のものが含まれます。
オブジェクト インスタンスをチェックして、指定された値タイプのボックス化された値であることを確認します。
インスタンスの値を値型変数にコピーします。
例:
次のようにコードをコピーします。
int i=123;
オブジェクトボックス=i;
int j=(int)box;