変数の自動型変換

変数は宣言した型に合う値しか代入できませんが、中にはJavaが自動的に型を変換してくれる場合もあります。これを知っておかないと思わぬところで不具合が発生する可能性があります。

変数の自動型変換 目次

  1. リテラルとは
  2. リテラルの表記方法
  3. 型の変換

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);
	}
}

自動型変換NGのパターン

この自動型変換は、気をつけておかないと思わぬところでハマる可能性がありますので、注意しましょう。

コメントを残す

サブコンテンツ

このページの先頭へ