JAvaにおける自動梱包解包機構(自動梱包、解箱とも呼ばれる)Auto-Boxing,UnBoxing
JDK 1.5以降多くの概念が導入された
Boxing Unboxing(箱詰め・解体・パッケージ化)やGeneric(汎用)という概念は、C#と驚くほど似ている.
ここでの箱詰めは、基礎データ型(intなど)を基礎型パッケージクラスのオブジェクト(new Integer()など)に変換するパッケージオブジェクトとして理解されるべきである.
ボックスの取り外しは、new Integer()などのベース・タイプ・パッケージ・クラスのオブジェクトをintなどのベース・データ・タイプに変換する逆プロセスです.
その全体を例に挙げます.
2行目は、Object型のmyObject強制型をIntegerに変換してint型のiに値を付ける
??自動梱包解体とは
基本データ型の自動梱包(autoboxing)、開梱(unboxing)はJ 2 SE 5.0より提供される機能です.
一般的にクラスのオブジェクトを作成するときは、次のようにします.
Integerオブジェクトを作成すると、次のようになります.
実際、上記のコードを実行するとき、システムは私たちのために実行しました:Integer i=new Integer(100);これが、基本データ型の自動梱包機能です.
??基本データ型とオブジェクトの違い
基本データ型はオブジェクトではなく、int、double、booleanなどで定義された変数、定数を使用します.
基本データ型には呼び出す方法がありません.
例:Integer i=100;
コンパイラが自動的に以下の構文コンパイルを行うことに相当します:Integer i=new Integer(100);
??いつ自動的に箱を分解しますか?
自動解体(unboxing)、すなわち、オブジェクト内の基本データをオブジェクトから自動的に取り出す.自動解体は次のように実現されます.
演算を行う場合は、自動梱包や解体も可能です.
説明:
equals()は、2つのオブジェクトの値(内容)が同じかどうかを比較します.
"=="は、2つのオブジェクトの参照(メモリアドレス)が同じかどうか、または2つの基本データ型の変数値が等しいかどうかを比較するために使用されます.
自動梱包時に–128から127までの値をIntegerオブジェクトとして梱包するとメモリに再利用されます.
したがって、例では、i 3とi 4は実際には同じオブジェクトに参照される.
-128から127までの値を超えると、箱詰めされたIntegerオブジェクトは再利用されません.
すなわち、一例として、i 1とi 2は異なるオブジェクトを参照している.
また、自動梱包機能を使用しない場合は、通常のクラスオブジェクトと同様に、次の例を参照してください.
??Stringの取り外し箱
まず例を見てみましょう.
これはどのように解釈しますか?何も見えないようです.では、例を見てみましょう.
第2の例では、eの初期値はdと異なるため、eとdはそれぞれfalseとしてオブジェクトを作成する.
同様に、第1の例のstr 3とstr 4もそれぞれnewオブジェクトであり、str 1とstr 2は同じオブジェクトを参照していることがわかる.
Boxing Unboxing(箱詰め・解体・パッケージ化)やGeneric(汎用)という概念は、C#と驚くほど似ている.
ここでの箱詰めは、基礎データ型(intなど)を基礎型パッケージクラスのオブジェクト(new Integer()など)に変換するパッケージオブジェクトとして理解されるべきである.
ボックスの取り外しは、new Integer()などのベース・タイプ・パッケージ・クラスのオブジェクトをintなどのベース・データ・タイプに変換する逆プロセスです.
: Integer a = new Integer() ;
a = 100 ;
: int b = new Integer(100) ;
その全体を例に挙げます.
Object myObject = 100; //Boxing + Upcasting
int i = (Integer) myObject; //Unboxing + Downcasting
最初の行は、intタイプの100をIntegerオブジェクトに箱詰めしてから、ObjectタイプにmyObjectに値を割り当てることです.2行目は、Object型のmyObject強制型をIntegerに変換してint型のiに値を付ける
??自動梱包解体とは
基本データ型の自動梱包(autoboxing)、開梱(unboxing)はJ 2 SE 5.0より提供される機能です.
一般的にクラスのオブジェクトを作成するときは、次のようにします.
Class a = new Class(parameter);
Integerオブジェクトを作成すると、次のようになります.
Integer i = 100; ( : int i = 100; )
実際、上記のコードを実行するとき、システムは私たちのために実行しました:Integer i=new Integer(100);これが、基本データ型の自動梱包機能です.
??基本データ型とオブジェクトの違い
基本データ型はオブジェクトではなく、int、double、booleanなどで定義された変数、定数を使用します.
基本データ型には呼び出す方法がありません.
eg: int t = 1; t. 。
Integer t =1; t. 。
??いつ自動梱包しますか例:Integer i=100;
コンパイラが自動的に以下の構文コンパイルを行うことに相当します:Integer i=new Integer(100);
??いつ自動的に箱を分解しますか?
自動解体(unboxing)、すなわち、オブジェクト内の基本データをオブジェクトから自動的に取り出す.自動解体は次のように実現されます.
1 Integer i = 10; // 2 int t = i; //
演算を行う場合は、自動梱包や解体も可能です.
1 Integer i = 10; 2 System.out.println(i++);
??Integer
// -128~127 Integer i1 = 200; Integer i2 = 200; System.out.println("i1==i2: "+(i1==i2)); // -128~127 Integer i3 = 100; Integer i4 = 100; System.out.println("i3==i4: "+(i3==i4));
:
i1==i2: false i3==i4: true
説明:
equals()は、2つのオブジェクトの値(内容)が同じかどうかを比較します.
"=="は、2つのオブジェクトの参照(メモリアドレス)が同じかどうか、または2つの基本データ型の変数値が等しいかどうかを比較するために使用されます.
自動梱包時に–128から127までの値をIntegerオブジェクトとして梱包するとメモリに再利用されます.
したがって、例では、i 3とi 4は実際には同じオブジェクトに参照される.
-128から127までの値を超えると、箱詰めされたIntegerオブジェクトは再利用されません.
すなわち、一例として、i 1とi 2は異なるオブジェクトを参照している.
また、自動梱包機能を使用しない場合は、通常のクラスオブジェクトと同様に、次の例を参照してください.
1 Integer i3 = new Integer(100); 2 Integer i4 = new Integer(100); 3 System.out.println("i3==i4: "+(i3==i4));// false
??Stringの取り外し箱
まず例を見てみましょう.
1 String str1 = "abc";2 String str2 = "abc";3 System.out.println(str2==str1); // true 4 System.out.println(str2.equals(str1)); // true 5 6 String str3 = new String("abc");7 String str4 = new String("abc"); 8 System.out.println(str3==str4); // false 9 System.out.println(str3.equals(str4)); // true
これはどのように解釈しますか?何も見えないようです.では、例を見てみましょう.
1 String d ="2"; 2 String e = "23";3 e = e.substring(0, 1);4 System.out.println(e.equals(d)); // true 5 System.out.println(e==d); // false
第2の例では、eの初期値はdと異なるため、eとdはそれぞれfalseとしてオブジェクトを作成する.
同様に、第1の例のstr 3とstr 4もそれぞれnewオブジェクトであり、str 1とstr 2は同じオブジェクトを参照していることがわかる.