前回に引き続きラッパークラスを解説します。 phoeducation.work
ラッパークラスのメソッド
ラッパークラスのコンストラクタを使ってラッパークラスのオブジェクトを作成する以外に、ラッパークラスには基本データ型やString型をラッパークラスのオブジェクトに変換するメソッドが用意されています。
また逆にラッパークラスオブジェクトを基本データ型に変換するメソッドも用意されています。
引数に指定された値をIntegerオブジェクトに変換するvalueOf()メソッド
※Characterクラス以外のラッパークラスにもvalueOfメソッドは定義されています。
引数に指定された値をint型に変換するparseInt()メソッド
※その他各ラッパークラスには、parseShort()、parseLong()、parseFloat()、parseDouble()が用意されています。
基本データ型に変換するXXXValue()メソッド
※その他各ラッパークラスには、shortValue()、longValue()、floatValue()、doubleValue()が用意されています。
【ラッパークラスのvalueOf()メソッド】
public class WrapperSample3 { public static void main(String[] args) { Integer obj1 = Integer.valueOf("100"); Short obj2 = Short.valueOf("200"); Long obj3 = Long.valueOf("300"); Float obj4 = Float.valueOf("400"); Double obj5 = Double.valueOf("500"); System.out.println(obj1 + obj2 + obj3 + obj4 + obj5); } }
実行結果
1500.0
各ラッパークラスのvalueOf()メソッドはstaticメソッドです。
クラス名.メソッド名として指定をしますので、Integer.valueOf()という形になります。
また引数には対応した基本データ型もしくはString型を取ることができます。
上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。
この変換により数値としての性質を保持することができたので、10行目で演算ができることがわかります。
【ラッパークラスのparseXXX()メソッド】
public class WrapperSample4 { public static void main(String[] args) { Integer obj1 = Integer.parseInt("100"); Short obj2 = Short.parseShort("200"); Long obj3 = Long.parseLong("300"); Float obj4 = Float.parseFloat("400"); Double obj5 = Double.parseDouble("500"); System.out.println(obj1 + obj2 + obj3 + obj4 + obj5); Integer obj6 = Integer.parseInt("abc"); } }
実行結果
1500.0 Exception in thread "main" java.lang.NumberFormatException: For input string: "abc" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at WrapperSample4.main(WrapperSample4.java:11)
各ラッパークラスのparseXXX()メソッドはstaticメソッドです。
クラス名.メソッド名として指定をしますので、Integer.parseInt()という形になります。
また引数には対応した基本データ型もしくはString型を取ることができます。
上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。
この変換により数値としての性質を保持することができたので、8行目で演算ができることがわかります。
また11行目では指定された引数が数値に変換できないので、NumberFormatException例外が発生しています。
【ラッパークラスのXXXValue()メソッド】
public class WrapperSample5 { public static void main(String[] args) { Integer obj1 = Integer.parseInt("100"); int i = obj1.intValue(); Short obj2 = Short.parseShort("200"); short s = obj2.shortValue(); Long obj3 = Long.parseLong("300"); long l = obj3.longValue(); Float obj4 = Float.parseFloat("400"); float f = obj4.floatValue(); Double obj5 = Double.parseDouble("500"); double d = obj5.doubleValue(); System.out.println(i + s + l + f + d); } }
実行結果
1500.0
各ラッパークラスのXXXValue()メソッドはインスタンスメソッドです。
オブジェクト名.メソッド名として指定をします。
3、6、9、12、15行目で各ラッパークラスのオブジェクトを作り、7、10、13、16行目でXXXValue()メソッドを使って、基本データ型へ変換しています。
また引数には対応した基本データ型もしくはString型を取ることができます。
上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。
この変換により数値としての性質を保持することができたので、18行目で演算ができることがわかります。
もし数値として変換できないような値(例えば"ABC"など)を引数に指定すると、NumberFormatExceptionのエラーが発生します。
ラッパークラスのequals()メソッド
ラッパークラスではObjectクラスのequals()メソッドがオーバーライドされて定義されています。
Objectクラスのequals()メソッドはオブジェクトが同じかどうかを調べるものでしたが、ラッパークラスのequals()メソッドはStringクラスのequals()メソッド同様に、格納されている値が同じかどうかを調べます。
ただし同じラッパークラス同士で、同じ値のみtrueを返します。たとえ値が同じでも、異なるラッパークラス同士ではfalseを返します。
【ラッパークラスのequals()メソッド】
public class WrapperSample6 { public static void main(String[] args) { Integer in1 = new Integer(123); Integer in2 = new Integer("123"); Short sh1 = new Short("123"); Short sh2 = new Short("123"); System.out.println(in1.equals(in2)); System.out.println(sh1.equals(sh2)); System.out.println(in1.equals(sh1)); } }
実行結果
true true false
3行目と4行目では同じ値を持つIntegerオブジェクトを作成しています。
また6行目と7行目では同じ値を持つShortオブジェクトを作成しています。
9行目と10行目は同じクラスの同じ値のオブジェクトなのでtrueを返します。
11行目はShort型のオブジェクトをInteger型と比較しているため、値は同じですが、falseが返されています。
autoboxing/unboxing機能
これまでラッパークラスのコンストラクタやメソッドを使って基本データ型をラッパークラス型に変換してきましたが、JDK5.0からこれらの変換を自動で行うautoboxing/unboxing機能が追加されました。
boxing機能は基本データ型をラッパークラスへ、unboxing機能はラッパークラスを基本データ型へ変換します。
ただし、ラッパークラスでないオブジェクトをunboxingしようとするとNullPointerException例外が発生します。
autoboxing/unboxing機能の注意事項
- autoboxing機能において暗黙の型変換は行われない。またラッパークラス同士の型変換も行われない。
- autoboxing機能によってラッパークラスオブジェクトが生成される時、メモリ効率を図るため、次の場合は同じオブジェクトを参照する。
・ trueまたはfalseのboolean値
・ int型、shot型の-128~127の範囲の整数
・ byte型の-128~127の範囲の整数
・ \u0000~\u007Fの範囲の文字 - equals()メソッドを利用した比較では、Integer型では同じint型を含むIntegerオブジェクトである場合、trueとなる。
【autobxing/unboxing機能1】
public class BoxingSample1 { public static void main(String[] args) { int i = 100; Integer obj = 200; int sum = i + obj; System.out.println(sum); } }
実行結果
300
3行目でint型の変数iに100を代入しています。4行目で200というint型の値をautoboxing機能によりInteger型に変換して変数objに格納しています。
5行目ではInteger型の変数objをunboxing機能によりint型に変換して、int型同士で演算子をし、int型の変数sumに代入しています。
【autobxing/unboxing機能2】
public class BoxingSample2 { public static void main(String[] args) { double d1 = 3.14f; //float型からdouble型への暗黙の型変換 Float d2 = 3.14f; //float型からFloat型へのautoboxing Double d3 = d2; //Float型からDouble型への変換 long l1 = 10; //int型からlong型への暗黙の型変換 Long l2 = l1; //long型からLong型へのautoboxing Float l3 = l2; //Long型からFloat型への変換 } }
3行目では基本データ型のfloat型の値を基本データ型のdouble型に変換しています。
これは暗黙の型変換なので問題はありません。
4行目では基本データ型のfloat型をラッパーラスのFloat型にautoboxingしています。
5行目ではFloat型をDouble型に代入してようとしていますが、ラッパークラス同士の型変換は行われないので、コンパイルエラーになります。
8行目ではint型のリテラルをlong型に変換しています。
これは暗黙の型変換なので問題ありません。
9行目ではlong型をLong型にautoboxingしていますので、問題ありません。
10行目はLong型をFloat型に変換しようとしていますが、異なる型のラッパークラス同士の変換なので、コンパイルエラーになります。
【autobxing/unboxing機能3】
public class BoxingSample3 { public static void main(String[] args) { Boolean b1 = true; Boolean b2 = true; System.out.println("b1 == b2 : " + (b1 == b2)); Integer i1 = 10; Integer i2 = 10; System.out.println("i1 == i2 : " + (i1 == i2) ); System.out.println("i1.equals(i2) : " +(i1.equals(i2)) ); Integer i3 = 128; Integer i4 = 128; System.out.println("i3 == i4 : " +(i3 == i4) ); System.out.println("i3.equals(i4) : " +(i3.equals(i4)) ); } }
実行結果
b1 == b2 : true i1 == i2 : true i1.equals(i2) : true i3 == i4 : false i3.equals(i4) : true
3行目と4行目ではBoolean型のオブジェクトを生成しています。
Boolean型では値がtrue同士もしくはfalse同士であれば同じオブジェクトを参照しますので、==演算子による比較はtrueを返します。
7行目と8行目ではint型の10という値をautoboxing機能でInteger型に変換しています。
Integer型の場合-128~127の範囲の値は同じオブジェクトを生成しますので、==演算子の比較はtrueになり、equals()メソッドの値比較でもtrueになります。
12行目と13行目では-128~127の範囲外である128を値としてIntegerオブジェクトを生成しているので、i3とi4は別々のオブジェクトとなります。
したがって==演算子ではfalseを返し、equals()メソッドではtrueを返します。
まとめ
ラッパークラス
基本データ型の性質をそのまま受け継いだオブジェクト型です。
ラッパークラスには、基本データ型に合わせて、Byte、Short、Integer、Long、Character、Float、Double型があります。
基本データ型をラッパークラスオブジェクトにするには、コンストラクタを使う方法とメソッドを使う方法があります。
ラッパークラスのequals()メソッドは、Objectクラスのequals()メソッドをオーバーライドして、値が等しいかどうかを判定します。
オブジェクト型と基本データ型を変換する際に、autoboxing/unboxing機能が働き、明示的に変換するソースコードを記述しなくてもよいです。
独学で挫折しそうになったら、オンラインプログラミングスクール