Java では、プリミティブとそのラッパーの機能はオートボックス化/アンボックス化です。この概念を掘り下げてみましょう。すでに学んだように、Java はオブジェクト指向言語です。つまり、Java で書かれたプログラムはすべてオブジェクトでできています。プリミティブはオブジェクトではありません。ただし、そうであっても、ラッパー変数にはプリミティブ値を割り当てることができます。このプロセスはオートボクシングと呼ばれます。同様に、プリミティブ変数にラッパー オブジェクトを割り当てることができます。このプロセスはアンボックス化と呼ばれます。例えば:
public class Main {
public static void main(String[] args) {
int x = 7;
Integer y = 111;
x = y; // Unboxing
y = x * 123; // Autoboxing
}
}
5 行目では、 Integerオブジェクト である y をプリミティブxに割り当てます。ご覧のとおり、追加の手順を実行する必要はありません。コンパイラは、intとIntegerが本質的に同じものであることを認識しています。それが開封です。6 行目のオートボクシングでも同様のことが起こっています。プリミティブ値 (x * 123) がオブジェクトyに簡単に割り当てられます。これはオートボクシングの例です。この用語に「自動」という単語が含まれるのはそのためです。プリミティブを対応するラッパー オブジェクトに割り当てるために特別なことをする必要がないからです (逆も同様です)。すべて自動的に行われます。便利ですね。:) メソッドを操作するときの自動ボックス化/アンボックス化の便利さの別の例を示します。これは、メソッドの引数もオートボックス化およびアンボックス化されるためです。たとえば、メソッドが 2 つのIntegerオブジェクトを入力として受け取る場合、代わりに通常のintを簡単に渡すことができます。
public class Main {
public static void main(String[] args) {
printNumber(7);// A standard int, not even an int variable
}
public static void printNumber(Integer i) {
System.out.println("You entered the number " + i);
}
}
出力:
You entered the number 7
逆の方向にも機能します。
public class Main {
public static void main(String[] args) {
printNumber(new Integer(632));
}
public static void printNumber(int i) {
System.out.println("You entered the number " + i);
}
}
覚えておく必要がある重要な点は、オートボックス化とボックス化解除は配列では機能しないということです。
public class Main {
public static void main(String[] args) {
int[] i = {1,2,3,4,5};
printArray(i);// Error, this won't compile!
}
public static void printArray(Integer[] arr) {
System.out.println(Arrays.toString(arr));
}
}
オブジェクトの配列を受け取るメソッドにプリミティブの配列を渡そうとすると、コンパイル エラーが発生します。結論として、もう一度プリミティブとラッパーを簡単に比較してみましょう。
プリミティブ:
- パフォーマンス上の利点がある
- 「すべてはオブジェクトである」原則に違反しないようにします。つまり、数値、文字、ブール値はこの概念に違反しません。
- 便利なメソッドとフィールドを提供することで、これらの値を操作する可能性を拡張します。
- メソッドがオブジェクトのみで動作する場合に必要です
GO TO FULL VERSION