Javaも他の言語と同様、変数があります。変数とは一時的に値を保持しておくもので、プログラムを作成する上で無くてはならない重要なものです。ここではJavaの変数およびその型について説明します。
変数には取り扱う値によって型を指定する必要があります。Javaには様々な型が用意されていますが、大きく分けて次の2種類に分類されます。
プリミティブ型は、算術演算などに使われる整数値や浮動小数点数、その他、真偽値、文字など基本となるデータを取り扱う型です。
型 | 表記 | サイズ | 値の範囲 | 備考 |
論理型 | boolean | - | true/false | 真偽値 |
文字型 | char | 2byte | 0 ~ 216-1 | Unicode の一文字 |
符号付整数型 | byte | 1byte | -27 ~ 27-1 | |
short | 2byte | -215 ~ 215-1 | ||
int | 4byte | -231 ~ 231-1 | ||
long | 8byte | -263 ~ 263-1 | ||
浮動小数点型 | float | 4byte | 単精度浮動小数点数 | IEEE 754 規格 |
double | 8byte | 倍精度浮動小数点数 | IEEE 754 規格 |
※C言語などは処理効率を優先させる為に基本となる型のサイズは処理系に依存させていますがJavaでは処理系に依存しない('Write once, run anywhere' )が基本理念であるためプリミティブ型のデータサイズは固定となっています。
プリミティブ型以外はすべて参照型となります。クラスやインターフェースなどを型として利用できるところが、オブジェクト指向言語の特徴でもあります。文字列を扱う「String」型や配列型なども参照型になります。参照型とプリミティブ型の違いなど詳細はこちらを参照してください。
Javaでは基本データ型もオブジェクトとして取り扱えるように、各基本データ型に対応する変換クラスが用意されています。このようなクラスをラッパークラスと呼びます。
基本データ型 | 対応するラッパークラス | 変換例 |
boolean | java.lang.Boolean | new Boolean(true); , Boolean.valueOf(true); |
char | java.lang.Character | new Character('A'); , Character.valueOf('A') |
byte | java.lang.Byte | new Byte("1"); , Byte.valueOf("1"); |
short | java.lang.Short | new Short("1"); , Short.valueOf("1") |
int | java.lang.Integer | new Integer(1); , Integer.valueOf(1); |
long | java.lang.Long | new Long(1L); , Long.valueOf(1L); |
float | java.lang.Float | new Float(1F); , Float.valueOf(1F); |
double | java.lang.Double | new Double(1D); , Double.valueOf(1D); |
※J2SE1.4以前ではコレクションやマップなどに対して直接プリミティブ型の値を取り扱う事ができずラッパークラスに変換して使用していましたが、J2SE5.0からは「オートボクシング(Autoboxing)/アンボクシング(Auto-Unboxing )」が導入され自動変換されるようになりました。
変数を使用するには、次のように宣言します。
データ型 変数名;
また変数を”,”(カンマ)で区切って複数の変数を宣言する事も出来ます。
データ型 変数名1, 変数名2, ・・・;
例えばint型の変数aに10代入する場合は次のようになります。
int a; a = 10;
また次のように宣言と同時に値の代入(初期化)することも可能です。
int a = 10;
変数名には次の約束があります。
abstract class extends import private switch volatile assert const final instanceof protected synchronized while boolean continue finally int public this break default float interface return throw byte do for long short throws case double goto native static transient catch else if new strictfp try char enum implements package super void
※「const」および「goto」はJavaで使用されていませんが、予約語になっています。
異なった型の変数で演算や代入を行うとき、条件を満たせばJavaは自動的に型変換(暗黙の型変換)を行います。また強制的に型を指定する事も可能で、これを明示的型変換(キャスト)といいます。
暗黙の型変換が行われるのは主に次のような場合です。
1.式内の各オペランドの型が異なるとき。
この場合、一番大きい型に統一されます。このような型変換を「型の昇格」と呼びます。型の順位は次のようになります。
char < short < int < long < float < double
但し、int型よりも小さい型はすべてint型に統一されます。これを「汎整数拡張」といいます。
2.異なる型へ代入するとき。
この場合は、左辺の型に変換されます。基本的にJavaはより小さい型への変換は禁止していますが、下記の場合にのみ変換が行われます。
「byte」、「short」、「char」の変数に、int型のリテラルや定数(int型の変数ではない)を代入する場合で、代入される変数の型の 範囲が代入値をカバーできている場合は縮小変換されます。
3.文字列を連結するとき。
+演算子の一方のオペランドがStringオブジェクトである場合、もう一方のオペランドが文字列に変換されて連結されます。
・サンプル(Sample0201.java)
public class Sample0201 { public static void main(String[] args) { float float_value = 0.5f; int int_value = 1; final int final_int_value=10; String str_value = "abc"; float f = float_value + int_value; // int型がfloat型に昇格して計算されfloat型に代入される。 byte b = final_int_value; // int型がbyte型に縮小され代入される。 String s = str_value + 1; // int型がString型に変換され代入される。 System.out.println("x="+ f); System.out.println("y="+ b); System.out.println("s="+ s); } }
・出力結果
C:\dev\java>javac Sample0201.java [Enter] C:\dev\java>java Sample0201 [Enter] x=1.5 y=10 s=abc1
「キャスト演算子」を使用することで、一時的に型を変換することが出来ます。
・サンプル(Sample0202.java)
public class Sample0202 { public static void main(String[] args) { int a = 5; int b = 2; float x; float y; x = a / b; // int型同士の演算なので算出結果もint型になる。 y = (float)a / b; // 一方のオペランドをfloat型に「キャスト」する事で式内最大のfloat型に揃えられる。 System.out.println("x="+ x); System.out.println("y="+ y); } }
・出力結果
C:\dev\java>javac Sample0202.java [Enter] C:\dev\java>java Sample0202 [Enter] x=2.0 y=2.5
ラッパークラスやStringクラスを使用することで型変換を行うことができます。
元の型 | 変換後の型 | 変換例 | ||
文字列 | 数値型 | byte型 | byte value = Byte.parseByte(string) | |
short型 | short value = Short.parseShort(string) | |||
int型 | int value = Integer.parseInt(string) | |||
long型 | long value = Long.parseLong(string) | |||
float型 | float value = Float.parseFloat(string) | |||
double型 | double value = Double.parseDouble(string) | |||
数値型 | byte型 | 文字列 | String string = String.valueOf(bytevalue) | |
short型 | String string = String.valueOf(shortvalue) | |||
int型 | String string = String.valueOf(intvalue) | |||
long型 | String string = String.valueOf(longvalue) | |||
float型 | String string = String.valueOf(floatvalue) | |||
double型 | String string = String.valueOf(doublevalue) |
※上記の使用方法はあくまで一例です。詳細はJDK API仕様を参照してください。