Javaプログラミングを学ぶ上で、最初に突き当たる壁の一つが「変数やメソッドの名前を自由に付けられない」というルールです。

Javaには、言語仕様としてあらかじめ役割が決められている予約語(Reserved Words)が存在します。

これらの言葉は、コンパイラがプログラムの構造を解析するために使用する特別な意味を持っているため、開発者が識別子(変数名、クラス名、メソッド名など)として使用することはできません。

本記事では、Javaの予約語の一覧から、それぞれの意味、そして混同しやすい「リテラル」や最新のJavaで導入された「文脈依存キーワード」についても詳しく解説します。

Javaの予約語とは

Javaの予約語とは、Java言語の構文を定義するためにあらかじめ予約されている単語のことです。

例えば、ifforなどは制御フローを示すために予約されており、これらを変数名として使うことはできません。

予約語を識別子として使おうとすると、コンパイル時に「式が不正です」や「識別子がありません」といったエラーが発生します。

Javaは大文字と小文字を厳密に区別するため、たとえばclassは予約語ですが、ClassCLASSは予約語ではなく、変数名として使用可能です(ただし、可読性の観点からは推奨されません)。

Javaの予約語一覧

現在、Javaで使用されている主な予約語をカテゴリ別に整理して紹介します。

基本データ型に関する予約語

Javaのプリミティブ型(基本型)を宣言するための単語です。

予約語意味
boolean真偽値(true/false)を扱う型
byte8ビット符号付き整数を扱う型
char16ビットUnicode文字を扱う型
double64ビット倍精度浮動小数点を扱う型
float32ビット単精度浮動小数点を扱う型
int32ビット符号付き整数を扱う型
long64ビット符号付き整数を扱う型
short16ビット符号付き整数を扱う型

制御フローに関する予約語

プログラムの実行順序を制御するための構文に使用されます。

予約語意味
breakループやswitch文から脱出する
caseswitch文内での条件分岐ラベル
continueループの現在の反復をスキップし、次へ進む
defaultswitch文でどのcaseにも該当しない場合の処理
dodo-whileループの開始を示す
elseif文の条件が偽の場合の処理
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~): モジュールシステム関連

予約語を使用した場合のコンパイルエラー例

実際に予約語を変数名に使おうとした場合に、どのような挙動になるかを確認してみましょう。

Java
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!

上記の例のように、intclassなどの完全な予約語はエラーになりますが、varは特定の文脈以外では識別子として機能します。

しかし、混乱を避けるために文脈依存キーワードも極力変数名には使わないのがベストプラクティスです。

予約語と識別子の命名ルール(注意点)

予約語を避ける以外にも、Javaの命名にはいくつかのルールと慣例があります。

これらを守ることで、誰にとっても読みやすいコードになります。

1. 先頭に数字は使えない

予約語でなくても、1valueのように数字から始まる名前は付けられません。

2. 使用可能な記号は「_」と「$」のみ

基本的には英数字を使用します。

my-value(ハイフン)やvalue!などは使用できません。

3. キャメルケースの活用

Javaでは慣例として以下のような命名規則が用いられます。

  • クラス名: 大文字で始める(例: UserManageService)
  • メソッド名・変数名: 小文字で始め、単語の区切りを大文字にする(例: getUserName)
  • 定数名: すべて大文字でアンダースコア区切り(例: MAX_RETRY_COUNT)

4. 予約語をどうしても名前に含めたい場合

例えば「class」という概念を名前に使いたい場合は、clazztargetClassclassNameのように、単語を組み合わせたり綴りを変えたりして回避します。

重要な予約語の活用シーン

いくつかの主要なキーワードがどのように使われるか、具体的なコード例を見てみましょう。

staticとfinalの組み合わせ

これらは定数を定義する際によく使われるキーワードです。

Java
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は単なる型チェックだけでなく、キャストを同時に行う機能が追加されました。

Java
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以降の制限付きキーワード)

不変なデータを保持するための簡潔なクラス定義です。

Java
// 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も識別子としては使用不可。
  • gotoconstのように、予約されているが使われていない単語もある。
  • varrecordなどの文脈依存キーワードは、特定の場所でのみ特別な意味を持つ。

最新のJavaでは、古いコードとの互換性を保ちつつ、新しいキーワードが慎重に追加されています。

予約語の一覧をすべて暗記する必要はありませんが、「エラーが出たときは予約語を疑ってみる」という感覚を身につけておくと、デバッグの効率が大幅に向上するでしょう。

命名規則を守り、予約語を適切に活用して、美しく読みやすいJavaコードを目指しましょう。