変数の自動型変換
変数は宣言した型に合う値しか代入できませんが、中にはJavaが自動的に型を変換してくれる場合もあります。これを知っておかないと思わぬところで不具合が発生する可能性があります。
変数の自動型変換 目次
1.リテラルとは
リテラルとは、「1」や「HelloWorld」などの値そのもののことで、ソースコード中に直接記述した値のことを言います。
このリテラルはデータ型を持っており、リテラルがどの型の情報を表すかは、リテラルの表記方法で決まります。
2.リテラルの表記方法
代表的なリテラルの表記方法とそれが表すデータ型を以下に示します。
リテラルの種類 | 表記例 | データ型 |
---|---|---|
整数 | 10 | int |
整数で末尾に「L」か「l」が付いている | 1000000L | long |
小数で末尾に何も無いか、「D」か「d」が付いている | 1.23 または 1.23D | double |
小数で末尾に「F」か「f」が付いている | 1.23F | float |
「true」または「false」 | true | boolean |
シングルコーテーションで囲まれた文字 | ‘a’ | char |
ダブルコーテーションで囲まれた文字列 | “あいう” | String |
2-1 進数記法
通常取り扱う数値は10進数ですが、8進数や16進数で表記する際は接頭辞(プレフィックス)を付けます。
進数 | 接頭辞 | 例 | 10進数の値 |
---|---|---|---|
10進数 | なし | 10 | 10 |
2進数 | 0b(ゼロビー) | 0b11 | 3 |
8進数 | 0(ゼロ) | 011 | 9 |
16進数 | 0x(ゼロエックス) | 0xFF | 255 |
これは実際にプログラムを書いてみると確認できます。
package pac01; public class HelloWorld { public static void main(String[] args) { int DecimalNumber = 10; int BinaryNumber = 0b11; int OctalNumber = 011; int HexadecimalNumber = 0xFF; System.out.println(DecimalNumber); System.out.println(BinaryNumber); System.out.println(OctalNumber); System.out.println(HexadecimalNumber); } } ---------------------------------------------------------- 10 3 9 255
3.型の変換
これまで、変数に値を代入する時は、宣言した時の型と違う型のデータを代入するとエラーになると説明してきましたが、中には許容されるケースもあります。この場合、違う型が代入しているのではなく、代入元のデータ型が自動的に代入先の型に変換されていることになります。
3-1 問題ない型変換
例えば、次の様な記述はエラーにはなりません。
package pac01; public class HelloWorld { public static void main(String[] args) { double dblHensu = 3; long lngHensu = 3; System.out.println(dblHensu); System.out.println(lngHensu); } } ---------------------------------------------------- 3.0 3
double型の変数にint型(整数)を代入してもエラーが起きておらず、printlnで表示してみると、「3.0」と小数になっていることが分かります。また、long型に3を代入していますが、これは「L」が付いていないのでint型になります。しかしエラーにはなっていません。
考え方としては、許容できるかどうか、はみ出していないかということです。「3」を「3.0」に変換しても値としては等しいですし、誤差が起きることもない。また「3」はint型であることを明示していませんし、long型が取り得る範囲に収まっているので、こちらも問題ないと言えます。
3-2 エラーになる型変換
反対に、エラーになるパターンは以下のような場合です。
package pac01; public class HelloWorld { public static void main(String[] args) { int intHensu = 3.0; int intHensu2 = 10L; System.out.println(intHensu); System.out.println(intHensu2); } }
この自動型変換は、気をつけておかないと思わぬところでハマる可能性がありますので、注意しましょう。
最近のコメント