Javaのリテラルには整数型、浮動小数点型、論理値型、文字型、文字列型、NULLがあります。
整数リテラルは一般的に馴染みのある10進数値のほかに、8進数、16進数による表現が可能です。 以下に有効な整数リテラルを示します。
・10進数表記 0-9の数字を並べたもの。負を表現する場合マイナスをつける 0 123 -5460 2147483647 ・8進数表記 0で始まり、0-7の数字を並べたもの。マイナスは不可(後述) 0123 076721 017777777777 ・16進数表記 0xまたは0Xで始まり、0-9a-fA-Fの数字/文字を並べたもの。マイナスは不可(後述) 0xff 0X102a 0XCaFe 0x7fffffff
Javaでは整数リテラルはデフォルトでint型(32bits)として扱われますが、long型(64bits)で表現することも可能です。long型にしたい場合、最後に大文字か小文字のL,lをつけます。lは1と間違いやすいのでLを使いましょう。
256L 0124L 0xABCDEFL
int型の有効範囲は-2147483648(-231)~2147483647(231-1)です。16進数及び8進数では、2147483647は0x7fffffff 及び 017777777777、-2147483648は0x80000000 及び 020000000000になる。16進数と8進数の、int型における最大値である0xffffffff、037777777777は10進数の-1を表現します。ちなみに、Integer.MIN_VALUE は -2147483648、Integer.MAX_VALUE は 2147483647 を意味する定数です。
long型の有効範囲は-9223372036854775808L(-263)~9223372036854775807L(263-1)です。0x7fffffffffffffffL 及び 0777777777777777777777L は 9223372036854775807Lを表し、0x8000000000000000L 及び 01000000000000000000000L は -9223372036854775808L を表し、 0xffffffffffffffffL 及び 01777777777777777777777L は-1L を表します。 ちなみにLong.MIN_VALUE 及び Long.MAX_VALUE はそれぞれlongの最小値、最大値を表す定数です。
Javaで浮動小数点値を扱うときは以下のようにします。
3.141592 .123 ( = 0.123) 5. ( = 5.0) 1.5e10( = 15000000000) 4.e-5 ( = 0.00004)
Javaの浮動小数点型にはfloat型(単精度浮動小数点型 = 32bits)とdouble型(倍精度浮動小数点型 = 64bits)があり、接尾語のf,F,d,Dによって設定する。なお、デフォルトではdouble型になる。
6f ( = float型 6.0) 40.F ( = float型 40.0) .5678d ( = double型 0.5678) 3.14e+2D( = double型 314.0)
float型、double型のリテラルを8進数あるいは16進数で表現したい場合、intをfloatに変換するFloat.intBitsToFloat(int)やlongをdoubleに変換するDouble.longBitsToDouble(long)を使う。
Float.intBitsToFloat(05671) Double.longBitsToDouble(0x400921FB54442D18L)
正の有限の範囲はfloatで1.40239846e-45f~3.40282347e+38f、doubleで4.94065645841246544e-324~1.79769313486231570e+308で、これはそれぞれFloat.MIN_VALUE 及び Float.MAX_VALUE、Double.MIN_VALUE 及び Double.MAX_VALUE という定数に等しい。無限大を表すにはFloat,Doubleの両クラスのPOSITIVE_INFINITY(正の無限大) 及び NEGATIVE_INFINITY(負の無限大)を使い、非数値を表すにはFloat.NaN、Double.NaN(Not a Number)を使います。
論理リテラルにはboolean型の二つのリテラルしか存在しません。すなわち、true(真)とfalse(偽)です。
true false
文字リテラルはchar型で、1つの文字かエスケープシーケンスをアポストロフィ(')で囲んだものです。はじめの'から終わりの'までの間に改行があってはいけません。
'a' '3' '\n' '\'' '\\' '\uFFFF' 'α' 'あ' '漢'
文字列リテラルはString型で、0個以上の文字を二重引用符(")で囲んだものです。はじめの"から終わりの"までの間に改行があってはいけません。
"" "abcdefg" "hello, world!\n" "\"" "あいうえお"
また、文字列の連結には+を使うことができます。
"abc" + "def" "今日の天気は" + // 式なので改行を入れられる "晴れです。"
String型はクラスなので、リテラルはオブジェクトとなり、変数にはデータへの参照が格納される。そのため、
String hello = "Hello", lo = "lo";
と宣言した場合、
1. (hello == "hello")はtrueを返し、
2. (hello == ("hel"+"lo"))はtrueを返すが、
3. (hello == ("hel"+lo))はfalseを返す。
という結果になる。定数式はコンパイル時に連結されるため2の場合も1と同等になりますが、3の場合実行時にオブジェクトが新規に作成され、helloと("hel"+lo)が別のオブジェクトを指し示すことになり、その結果オブジェクト同士の比較(A == B)においては同等ではないと判断されることになる。これを避けるには以下のようにする。
※以下は両方ともtrueを返す。
4. (hello.equals("hel"+lo))
5. (hello == ("hel"+lo).intern())
4は参照先が等しいかどうかで判断するのではなく、データが等しいかで判断するためtrueになり、5はinternメソッドを用い、既存のオブジェクトにデータが等しいものがある場合にそれを参照先として返しているため、trueになります。
\から始まる2文字を指してエスケープシーケンスと呼びます。エスケープシーケンスは文字・文字列リテラルで、一般的に、直接文字として表現できないものなどを表現するために使います。以下がエスケープシーケンスの一覧です。
\b バックスペース(=\u0008) \t 水平タブ(=\u0009) \n ラインフィード(一般的な改行の表現に使う)(=\u000a) \f フォームフィード(=\u000c) \r キャリッジリターン(=\u000d) \" 二重引用符(=\u0022) \' 一重引用符(=\u0027) \\ \自身(=\u005c) \000~\377 \u0000~\u00ff
ちなみに\uではじまる4桁の数値はUnicode文字を意味しており、エスケープシーケンスと異なりコンパイルの直前にUnicode文字に変換されます。
空型のリテラルはただ一つnullだけです。 参照がからっぽであることを表現するにはnullを使います。
null