やあ!あなたはすでにプリミティブ型についてよく知っており、プリミティブ型についてかなりの作業を行ってきました。プログラミング (特に Java) では、プリミティブには多くの利点があります。プリミティブはメモリ使用量が少なく (そのため、プログラムの効率が向上します)、値の範囲が明確に定義されています。しかし、Java を学習している間、私たちはすでに「Java のすべてはオブジェクトである」という信念を繰り返してきました。しかし、プリミティブはこれらの言葉と真っ向から矛盾します。それらは物体ではありません。では、私たちの「すべてはオブジェクトである」という原則は間違っているのでしょうか? 実際にはそうではありません。Java では、すべてのプリミティブ型には双子の兄弟であるラッパー クラスがあります。
ラッパークラスとは何ですか?
ラッパーは、プリミティブを内部に格納する特別なクラスです。ただし、これはクラスであるため、そのインスタンスを作成できます。これらはプリミティブ値を内部に保存しますが、依然として実際のオブジェクトです。ラッパー クラス名は、対応するプリミティブの名前と非常に似ています (またはまったく同じです)。したがって、覚えやすいです。
プリミティブ データ型のラッパー クラス |
プリミティブデータ型 |
ラッパークラス |
整数 |
整数 |
短い |
短い |
長さ |
長さ |
バイト |
バイト |
浮く |
浮く |
ダブル |
ダブル |
文字 |
キャラクター |
ブール値 |
ブール値 |
ラッパー オブジェクトは、他のオブジェクトと同じ方法で作成されます。
public static void main(String[] args) {
Integer i = new Integer(682);
Double d = new Double(2.33);
Boolean b = new Boolean(false);
}
ラッパー クラスを使用すると、プリミティブ型の欠点を軽減できます。最も明白なのは、プリミティブにはメソッドがないことです。
たとえば、 toString()メソッドがないため、
intをStringに変換することはできません。しかし、
Integerラッパー クラスを使用すると、これが簡単になります。
public static void main(String[] args) {
Integer i = new Integer(432);
String s = i.toString();
}
ただし、逆方向への変換はより困難になる可能性があります。
Stringがあり、それには数値が含まれていることがわかっているとします。
いずれにせよ、プリミティブint を使用してStringから数値を抽出し、それを数値に変換するネイティブな方法はありません。しかし、ラッパークラスを使えばそれが可能です。
public static void main(String[] args) {
String s = "1166628";
Integer i = Integer.parseInt(s);
System.out.println(i);
}
出力:
1166628
Stringから数値を抽出し、それを
整数参照変数
iに割り当てました。ところで、参考文献について。引数は、値によるプリミティブと参照によるオブジェクトというさまざまな方法でメソッドに渡されることはすでにご存知でしょう。この知識は、独自のメソッドを作成するときに使用できます。たとえば、メソッドで小数が使用されているが、参照渡しのロジックが必要な場合は、
double /
floatの代わりに
Double /
Float引数をメソッドに渡すことができます。ラッパー クラスのメソッドに加えて、その静的フィールドも非常に便利です。たとえば、次のタスクがあると想像してください: 可能な最大値を表示する
int値の後に可能な最小値が続きます。この問題はかなり基本的なもののように思えます。しかし、Google がなければ、それができる可能性は低いでしょう。しかし、ラッパーを使用すると、そのような「日常的なタスク」を簡単に処理できます。
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
これらのフィールドにより、より重要なタスクの実行に集中できなくなります。言うまでもなく、
2147483647 (これは MAX_VALUE の値です) を入力するのは簡単な作業ではありません。:) さらに、前のレッスンでは、ラッパー オブジェクトは不変であると指摘しました。
public static void main(String[] args) {
Integer a = new Integer(0);
Integer b = new Integer(0);
b = a;
a = 1;
System.out.println(b);
}
出力:
0
a が元々指していたオブジェクトの状態は変化しませんでした (
bの値も変化するため)。
Stringの場合と同様、ラッパー オブジェクトの状態を変更する代わりに、まったく新しいオブジェクトがメモリ内に作成されます。
![Java のラッパー クラス - 2]()
では、なぜ Java の作成者は最終的に言語にプリミティブ型を残すことに決めたのでしょうか? すべてはオブジェクトである必要があり、プリミティブが表現するものすべてを表現できるラッパー クラスがあるのであれば、なぜ言語内にラッパーを保持し、プリミティブを削除しないのでしょうか。答えは簡単、「パフォーマンス」です。プリミティブ型は、オブジェクトの「重量のある」機能の多くが欠けているため、プリミティブと呼ばれます。はい、オブジェクトには便利なメソッドがたくさんありますが、それらは必ずしも必要というわけではありません。必要なのは数値 33、2.62、または
true /
falseだけである場合もあります。オブジェクトの利点が重要ではなく、プログラムの機能に必要ない状況では、プリミティブの方がこのタスクにははるかに適しています。
GO TO FULL VERSION