論理型
論理型のリテラルはtrue、falseの2つ。
| 1 2 3 4 5 6 | System.out.println(true);           // true System.out.println(false);          // false System.out.println(!true);          // false System.out.println(!false);         // true System.out.println(true && false);  // false System.out.println(true || false);  // true | 
整数型
int/short/byte
各基数による表現
intの範囲以内の整数は10進、2進、8進、16進で表現可能。
8進表現は頭に’0‘を付ける。以下の表現は8進で表現できない値を指定していることになって、エラーになる。10進や16進表現で要注意。
- 08、- 09→範囲外
- 0a、- 0bなど→構文エラー
| 基数 | 例 | 範囲 | 
| 10進 | 63 | -2147483648~2147483647 | 
| 2進 | 0b111111 | 0b0~0b11111111111111111111111111111111 | 
| 8進 | 077 | 00~037777777777? | 
| 16進 | 0x3f | 0x0~0ffffffff | 
型
整数系のリテラルは、各型で表現できる範囲とビットパターンとの関係で注意が必要。
たとえばbyte型の表現範囲は−128~127で、当然以下のような代入は可能だが、これを超える値は代入できない。
| 1 2 3 4 5 | byte b; b = -128; b = 127; b = -129; // コンパイルエラー b = 128;  // コンパイルエラー | 
一方、2進や16進で表現した場合のリテラルは、型によって解釈の仕方が変わるため、代入結果の値に注意が必要。
たとえば2進数0b1111|1111(16進数0xff)は、byte型なら2の補数表現で−1、short型やint型など9ビット以上を扱えるなら、9ビット目以上が0で埋められて255となる。
| 1 2 | short s = 0b11111111; System.out.println(s);      // 255 byte b = (byte)0b11111111; System.out.println(b); // -1 | 
最上位ビットが8ビット目や16ビット目でそれが1の場合、正数で解釈できる型になり、敢えて補数でマイナス表現としたいときには(byte)などでキャストする必要がある。
符号
各表現に+/-をつけることができて、−をつけると負数になる。
| 1 2 3 4 | System.out.println(-63);       // -63 System.out.println(-0b111111); // -63 System.out.println(-077);      // -63 System.out.println(-0x3f);     // -63 | 
各基数による表現を正規表現で表すと以下のような感じか。
| 10進 | ^[+-]?[1-9][0-9]*$(ただし範囲内) | 
| 2進 | ^[+-]?0b0*1[01]{0,31}$ | 
| 8進 | ^[+-]?0+[1-4]?[0-7]{0,10}$ | 
| 16進 | ^[+-]?0x0*[0-9A-Fa-f]{0,8}$ | 
long
long型の整数は末尾にl/Lをつける。
- int型の範囲内の数でも末尾に- Lをつけると- long型になる
- int型の範囲を超える数は末尾に- Lが必須。
| 1 2 3 4 5 6 7 8 | System.out.println(1L);           // int以下の範囲でもL/lをつけるとlong型 System.out.println(2147483647);   // intの最大値 System.out.println(2147483648L);  // intの範囲を超える場合はL/lが必要 System.out.println(0xffffffff);   // 2進/16進表記の限界、intでは-1 System.out.println(0xffffffffL);  // long型を明示すると正数の4294967295 System.out.println(0x100000000L); // intの範囲を超える場合はL/lが必要(4294967296) System.out.println(9223372036854775807L);  // longの最大値(L/lは必須) // System.out.println(9223372036854775808L);  // longの範囲外は扱えない | 
8進表記の不思議
8進数の場合が不規則。以下の様に2進表記の32ビットを3ビットごとに区切れば8進表示となる。
0b01|11-1|111|-111|1-11|11-1|111|-111|1-11|11-1|111
= 017777777777
0b11|11-1|111|-111|1-11|11-1|111|-111|1-11|11-1|111
= 037777777777
これから、8進表示の整数リテラルの上限は037777777777(10進で−1)となりそうだが、実際には047777777777まで通る。
| 1 2 3 4 5 6 7 8 9 | System.out.println(07777777777);  // 1073741823 System.out.println(017777777777); // 2147483647 System.out.println(020000000000); // -2147483648 System.out.println(020000000001); // -2147483647 System.out.println(037777777777); // -1 System.out.println(040000000000); // 0 System.out.println(040000000001); // 1 System.out.println(047777777777); // 1073741823 // System.out.println(050000000000); // 範囲外エラー | 
実数型
double/float
Javaの実数型は浮動小数点形式のfloatとdoubleの2つ。
小数点表示をした場合はdoubleとして解釈され、これにfをつけるとfloatで解釈される。
| 1 2 3 | System.out.println(1 / 3);    // 0 System.out.println(1.0 / 3);  // 0.3333333333333333 System.out.println(1.0f / 3); // 0.33333334 | 
小数点と整数部か小数部のいずれかがあれば実数型に解釈される。
| 1 2 3 4 | System.out.println(1. / 3);   // 0.3333333333333333 System.out.println(.1 / 3);   // 0.03333333333333333 System.out.println(1.f / 3);  // 0.33333334 System.out.println(.1f / 3);  // 0.033333335 | 
整数表現にfをつけるとfloat、dをつけるとdoubleに解釈される。
| 1 2 | System.out.println(1f / 3);   // 0.33333334 System.out.println(1d / 3);   // 0.3333333333333333 | 
文字型
char
文字指定
文字リテラルは、1文字をシングルクォート(')で囲む。全角文字もそのまま。2文字以上はエラー。
| 1 2 3 | System.out.println('K');    // K System.out.println('あ');   // あ System.out.println('KLM');  // エラー:文字定数が無効 | 
ダブルクォートで囲まれた場合は文字列(String)であり、char型ではない。charはプリミティブ型、Stringは参照型なのでキャストもできない。
| 1 2 | System.out.println("M");  // M→Stringとして表示されている char c = "M";             // 型の不一致: String から char には変換できません | 
エスケープ
シングルクォートや改行コード、タブコードなどの特殊文字はエスケープして定義する。
| 1 2 3 4 5 6 | System.out.print('\''); System.out.print('1'); System.out.print('\t'); System.out.print('2'); System.out.println('\''); // '1  2' | 
ユニコード指定
文字リテラルは、ユニコードのコードポイントでも指定可能。その場合、シングルクォートの中で\uでコードポイントを指定する。
ただしシングルクォートのコードポイント\u0027を指定すると文字定数が無効のエラーになる。ユニコードがコンパイルされたときに'''というリテラルになるためか。
| 1 2 3 | System.out.println('\u004b'); // K System.out.println('\u3042'); // あ //  System.out.println('\u0027'); // エラー:文字定数が無効 |