Javaプログラミングを学ぶ上で、最初に突き当たる壁の一つが「変数やメソッドの名前を自由に付けられない」というルールです。
Javaには、言語仕様としてあらかじめ役割が決められている予約語(Reserved Words)が存在します。
これらの言葉は、コンパイラがプログラムの構造を解析するために使用する特別な意味を持っているため、開発者が識別子(変数名、クラス名、メソッド名など)として使用することはできません。
本記事では、Javaの予約語の一覧から、それぞれの意味、そして混同しやすい「リテラル」や最新のJavaで導入された「文脈依存キーワード」についても詳しく解説します。
Javaの予約語とは
Javaの予約語とは、Java言語の構文を定義するためにあらかじめ予約されている単語のことです。
例えば、ifやforなどは制御フローを示すために予約されており、これらを変数名として使うことはできません。
予約語を識別子として使おうとすると、コンパイル時に「式が不正です」や「識別子がありません」といったエラーが発生します。
Javaは大文字と小文字を厳密に区別するため、たとえばclassは予約語ですが、ClassやCLASSは予約語ではなく、変数名として使用可能です(ただし、可読性の観点からは推奨されません)。
Javaの予約語一覧
現在、Javaで使用されている主な予約語をカテゴリ別に整理して紹介します。
基本データ型に関する予約語
Javaのプリミティブ型(基本型)を宣言するための単語です。
| 予約語 | 意味 |
|---|---|
boolean | 真偽値(true/false)を扱う型 |
byte | 8ビット符号付き整数を扱う型 |
char | 16ビットUnicode文字を扱う型 |
double | 64ビット倍精度浮動小数点を扱う型 |
float | 32ビット単精度浮動小数点を扱う型 |
int | 32ビット符号付き整数を扱う型 |
long | 64ビット符号付き整数を扱う型 |
short | 16ビット符号付き整数を扱う型 |
制御フローに関する予約語
プログラムの実行順序を制御するための構文に使用されます。
| 予約語 | 意味 |
|---|---|
break | ループやswitch文から脱出する |
case | switch文内での条件分岐ラベル |
continue | ループの現在の反復をスキップし、次へ進む |
default | switch文でどのcaseにも該当しない場合の処理 |
do | do-whileループの開始を示す |
else | if文の条件が偽の場合の処理 |
for | 繰り返し処理(ループ)を開始する |
if | 条件分岐を開始する |
return | メソッドの実行を終了し、値を返す |
switch | 多方向分岐(条件選択)を開始する |
while | 条件が真の間、繰り返し処理を行う |
修飾子に関する予約語
クラス、メソッド、変数の性質を定義するために使用されます。
| 予約語 | 意味 |
|---|---|
abstract | 抽象クラスや抽象メソッドを宣言する |
final | 継承不可、オーバーライド不可、再代入不可を定義する |
native | 他の言語(C言語など)で実装されたメソッドであることを示す |
private | クラス内からのみアクセス可能にする |
protected | 同一パッケージまたはサブクラスからアクセス可能にする |
public | どこからでもアクセス可能にする |
static | インスタンスではなくクラスに属することを示す |
strictfp | 浮動小数点計算の移植性を保証する(現在はほぼ形骸化) |
synchronized | マルチスレッド実行時の排他制御を行う |
transient | シリアライズ(直列化)の対象外に指定する |
volatile | 変数の値が複数のスレッドから安全に参照されることを保証する |
クラス、オブジェクト、インターフェースに関する予約語
オブジェクト指向プログラミングの核となる構成要素を定義します。
| 予約語 | 意味 |
|---|---|
class | 新しいクラスを定義する |
extends | クラスを継承する |
implements | インターフェースを実装する |
interface | インターフェースを定義する |
new | 新しいオブジェクトのインスタンスを生成する |
package | クラスが所属するパッケージを指定する |
super | 親クラスのメンバを参照する |
this | 現在のインスタンス自身を参照する |
instanceof | オブジェクトが特定の型であるかを確認する |
enum | 列挙型を定義する |
例外処理に関する予約語
エラーハンドリングに使用されます。
| 予約語 | 意味 |
|---|---|
try | 例外が発生する可能性のあるブロックを開始する |
catch | 発生した例外を捕捉して処理する |
finally | 例外の有無に関わらず必ず実行されるブロック |
throw | 意図的に例外をスローする |
throws | メソッドが投げる可能性のある例外を宣言する |
assert | プログラムの前提条件をチェックする(アサーション) |
その他および未使用の予約語
| 予約語 | 意味 |
|---|---|
void | メソッドが値を返さないことを示す |
import | 他のパッケージのクラスを利用可能にする |
const | 未使用 (C++の名残で予約されているが使えない) |
goto | 未使用 (将来のために予約されているが使えない) |
予約語ではないが「予約語のように扱われる」もの
Javaには、厳密な言語仕様上の「予約語」リストには含まれていないものの、識別子として使用できないリテラルが存在します。
初心者の方はこれらも予約語の一部として覚えておくとスムーズです。
- true : boolean型の真を表すリテラル
- false : boolean型の偽を表すリテラル
- null : オブジェクトの参照がないことを表すリテラル
これらは「リテラル(定数のような値)」ですが、変数名に使うことはできません。
例えば int true = 10; と記述するとコンパイルエラーになります。
文脈依存キーワード(Contextual Keywords)
Java 9以降、モジュールシステムの導入や新しい言語機能(レコード、シールクラスなど)の追加に伴い、特定の場所でのみ特別な意味を持つキーワードが登場しました。
これらは「制限されたキーワード」や「文脈依存キーワード」と呼ばれます。
これらは、特定の構文内ではキーワードとして機能しますが、それ以外の場所では変数名やメソッド名として使用できるという特徴があります。
これは、既存の古いプログラム(これらの単語を変数名として使っているコード)との互換性を保つための工夫です。
代表的な文脈依存キーワード
var(Java 10~): ローカル変数の型推論yield(Java 13~): switch式での値の返却record(Java 14~): データ保持に特化したクラス定義sealed,permits,non-sealed(Java 15~): 継承の制限module,requires,exports,opens,uses,provides,with(Java 9~): モジュールシステム関連
予約語を使用した場合のコンパイルエラー例
実際に予約語を変数名に使おうとした場合に、どのような挙動になるかを確認してみましょう。
public class KeywordErrorExample {
public static void main(String[] args) {
// 予約語 'int' を変数名に使おうとする (コンパイルエラー)
// int int = 10;
// 予約語 'class' を変数名に使おうとする (コンパイルエラー)
// String class = "Java";
// 文脈依存キーワード 'var' は変数名として使える (Java 10以降でも互換性のため可能)
int var = 100;
System.out.println("varの値: " + var);
// ただし、型推論としての 'var' も使える
var message = "Hello, Java!";
System.out.println(message);
}
}
varの値: 100
Hello, Java!
上記の例のように、intやclassなどの完全な予約語はエラーになりますが、varは特定の文脈以外では識別子として機能します。
しかし、混乱を避けるために文脈依存キーワードも極力変数名には使わないのがベストプラクティスです。
予約語と識別子の命名ルール(注意点)
予約語を避ける以外にも、Javaの命名にはいくつかのルールと慣例があります。
これらを守ることで、誰にとっても読みやすいコードになります。
1. 先頭に数字は使えない
予約語でなくても、1valueのように数字から始まる名前は付けられません。
2. 使用可能な記号は「_」と「$」のみ
基本的には英数字を使用します。
my-value(ハイフン)やvalue!などは使用できません。
3. キャメルケースの活用
Javaでは慣例として以下のような命名規則が用いられます。
- クラス名: 大文字で始める(例:
UserManageService) - メソッド名・変数名: 小文字で始め、単語の区切りを大文字にする(例:
getUserName) - 定数名: すべて大文字でアンダースコア区切り(例:
MAX_RETRY_COUNT)
4. 予約語をどうしても名前に含めたい場合
例えば「class」という概念を名前に使いたい場合は、clazzやtargetClass、classNameのように、単語を組み合わせたり綴りを変えたりして回避します。
重要な予約語の活用シーン
いくつかの主要なキーワードがどのように使われるか、具体的なコード例を見てみましょう。
staticとfinalの組み合わせ
これらは定数を定義する際によく使われるキーワードです。
public class Constants {
// static: インスタンス化せずに参照可能
// final: 値の変更を禁止(定数化)
public static final double PI = 3.1415926535;
public static void main(String[] args) {
System.out.println("円周率: " + PI);
}
}
instanceof と型パターン (Modern Java)
Java 16以降、instanceofは単なる型チェックだけでなく、キャストを同時に行う機能が追加されました。
public class PatternMatchingExample {
public static void main(String[] args) {
Object obj = "これはJavaの文字列です";
// instanceofキーワードと変数宣言を組み合わせる
if (obj instanceof String s) {
// ここで 's' は既にString型として扱える
System.out.println("文字列の長さ: " + s.length());
}
}
}
record (Java 14以降の制限付きキーワード)
不変なデータを保持するための簡潔なクラス定義です。
// recordキーワードを使用してデータクラスを定義
public record User(int id, String name) {}
class RecordTest {
public static void main(String[] args) {
User user = new User(1, "Tanaka");
System.out.println(user.name()); // 自動生成されたアクセサを使用
}
}
まとめ
Javaの予約語は、言語の基盤を支える重要なパーツです。
これらを正しく理解し、識別子として使用しないように注意することは、Javaプログラミングの第一歩と言えます。
- 予約語は、変数名やクラス名には使えない。
true,false,nullも識別子としては使用不可。gotoやconstのように、予約されているが使われていない単語もある。varやrecordなどの文脈依存キーワードは、特定の場所でのみ特別な意味を持つ。
最新のJavaでは、古いコードとの互換性を保ちつつ、新しいキーワードが慎重に追加されています。
予約語の一覧をすべて暗記する必要はありませんが、「エラーが出たときは予約語を疑ってみる」という感覚を身につけておくと、デバッグの効率が大幅に向上するでしょう。
命名規則を守り、予約語を適切に活用して、美しく読みやすいJavaコードを目指しましょう。
