キーワード (Java)

この項目ではJavaにおけるキーワード(予約語の記事も参照)に関して説明する。Java 25現在、予約キーワード(reserved keyword)が51個、コンテキスト・キーワード(contextual keyword)が17個ある。

予約キーワードは識別子に用いることはできない。コンテキスト・キーワードは文脈に応じて識別子に用いることができたりできなかったりする。例えばコンテキスト・キーワードのopenはServerSocketChannel.open()などで識別子に用いられている。

この項目は、プログラムの細かい説明には立ち入らず、他の言語と比較できるような説明を目的としている。

特徴

プリミティブ型名や分岐処理 (if, switch)、反復処理 (for, while) などの基本的な構文とキーワードはC言語およびC++と共通するものが多い。クラスや例外処理に関してはC++類似の構文とキーワードが多い。

沿革

以下のキーワードが追加されている。

プリミティブ型

型名

プリミティブ型の名前である。C言語およびC++と共通するものが多い。ただし内部表現は処理系依存ではなく、言語仕様によって厳密に定められている。

値(キーワードではない)

以下はキーワードであるかのように扱われるが、キーワードではなく、定義では論理値リテラル、またはnullリテラルというリテラルである。

モジュール

モジュールでは以下のキーワードが使われている。

パッケージ

クラス

修飾子

クラス、メンバの宣言に付けられる修飾子である。

例1:

public class SampleClass {
    final int constantValue = 5;
}

例2:

public class SampleClass {
    final int constantValue; // 初期化なし

    // コンストラクタ
    public SampleClass() {
        constantValue = 5;  // 1回だけ代入できる。
    }
}

記述例:

class SampleClass {
    static String shared = "shared";
    static final String STR = "constant";
}
メソッドに付けられた場合は、オブジェクトを生成しなくても直接呼び出せるメソッド(静的メソッド、クラスメソッド)であることを表す。手続き型言語の関数と同じ扱いになる。

例:

class Sample1 {
    // static なメソッド
    public static void method() { ... }
}

class Sample2 {
    void proc() {
        ...
        Sample1.method(); // インスタンスを生成せず直接実行できる。
        ...
    }
}
クラス内にstatic {...}というブロックが現れた場合は、そのクラスが最初に参照されたときにそのブロック内のコードを実行する。これを静的初期化子と呼び、主にstatic finalな配列やCollectionオブジェクトの初期化などに利用される。データベースにアクセスするためにJDBCドライバを呼び出すClass.forName("ドライバ名")もこの静的初期化子を呼び出している。

例:

class StaticInitSampleClass {
    private static final List<String> list;

    static {
        final List<String> tempList = new ArrayList<>();
        tempList.add("Hello,");
        tempList.add("World.");
        StaticInitSampleClass.list = Collections.unmodifiableList(tempList);
    }
}

内部クラス

入れ子にされたクラス(ネストされたクラス: nested class)のうち、static修飾されていないものは内部クラス (inner class) と呼ばれ、暗黙的に外側のクラスのインスタンスをキャプチャして参照することができるが、このネストクラスをstatic修飾すると静的ネストクラス (static nested class) となり、暗黙的に外側のクラスのインスタンスを参照できなくなる。

例:

class OuterClass {
    static int outerStaticField = 0;
    int outerField = 0;

    class InnerClass {
        void setOuterField(int value) {
            outerField = value; // 暗黙参照可能。
            outerStaticField = value; // OK。
        }
    }

    static class StaticClass {
        void setOuterField(int value) {
            //outerField = value; // コンパイルエラー。
            outerStaticField = value; // OK。
        }
    }

    public OuterClass() {
        new InnerClass().setOuterField(100);
        new StaticClass().setOuterField(-100);
    }

    public static void test() {
        final OuterClass outer = new OuterClass();
        System.out.println("OuterField = " + outer.outerField);
        System.out.println("OuterStaticField = " + outerStaticField);
    }
}

記述例:

public abstract class Sample {
    // 実装があるメソッド
    public void method1() {
        ...
    }
    // 実装がないメソッド
    public abstract void method2();
}

記述例1:

public synchronized void method() { ... }

記述例2:

public void method() {
    ...
    synchronized(this) { // 自クラスのインスタンスに対して排他制御
        // 排他制御されるブロック
    }
    ...
}

記述例3:

public void method(Object obj) {
    ...
    synchronized(obj) { // Object obj に対して排他制御
        // 排他制御されるブロック
    }
    ...
}

例:

public class SampleClass {
    volatile int syncSample;
    ...
}

制御構造

C言語およびC++と共通のキーワードを使用している。

例外処理

例外処理はC言語にはない。Javaでは、C++およびC#とほぼ共通の構文およびキーワードが使用されている。ただしfinallyはC++には存在せず、throwsはC#には存在しない。

以下はIOExceptionを使った記述例である。

public void method() throws Exception { // メソッドが例外をスローすることを宣言
    try {
        ...
        if (エラー条件) {
            throw new IOException(); // 例外を発生させる。
        }
        // (1) 正常終了
        // このtryブロックにはreturn文を記述することもできる。
        // ただし、finallyブロックにすでにreturn文があるときは、ここにreturn文を書いてもfinallyブロックのreturnが優先される。
    } catch (IOException e) { // IOException は Java の例外クラスの1つ
        // (2) 例外処理
        // このcatchブロックにはreturn文を記述することもできる。
        // ただし、finallyブロックにすでにreturn文があるときは、ここにreturn文を書いてもfinallyブロックのreturnが優先される。
    } catch (Exception e) { // IOException よりも上位(親)の例外クラス
        // (3) 例外をさらに外のブロックにスローする。
        throw e;
    } finally {
        // (1), (2), (3) どの場合でもこのブロックは必ず実行される。
        // ここにreturn文があるときはtry/catchブロックにreturn文があろうともこちらのreturn文が優先される。
        ...
    }
}

assert

型の省略

変数名の省略

浮動小数点演算

浮動小数点演算の移植性を高めるstrictfpがある。浮動小数点の演算では一般に全く同じ結果は期待できないものではあるが、x87などハードウェアによっては、途中の値においてより高い精度や、より広い値の範囲で演算が行われるために、最終結果が他のプラットフォームと一致しない場合があり、特にIEEE 754を前提として予想される結果から外れることが問題である。

strictfpを指定すると、途中結果についても全てIEEE 754の倍精度を強制し、相異なるプラットフォーム同士の間でも演算結果が一致することを保証するとされている(仕様では FP-strict という用語を使っている)。Java VMの実装で、これを正しく実現するには、x86系CPUを使った計算機の場合、x87を避けてSSE2で計算するか、それができない場合は特殊なテクニックが必要である。

なお、同様に移植性のある結果を保証するStrictMathというクラスがあるが、そちらはFDLIBMというSun製のライブラリと同じ結果を保証するとされている。

Java 17以降は常にstrictfpを付けたときの挙動と同じになった。x86系CPUでは常にSSE2以降を使用して計算する。

未使用

const、gotoがキーワードとして予約されているが、Javaでは使用できない。使用するとコンパイル時に構文エラーになる。

脚注

[脚注の使い方]

注釈

  1. ↑ Java言語仕様においてreserved wordではなくkeywordと呼んでいる。

出典

  1. ↑ “Chapter 3. Lexical Structure - §3.9. Keywords”. Java SE 7 Specifications > Java Language Specification. Oracle. 2024年3月5日閲覧。
  2. 1 2 “3.9. Keywords - Chapter 3. Lexical Structure - Java SE 25”. docs.oracle.com. 2025年10月20日閲覧。
  3. ↑ “Java Language Specification First Edition”. download.oracle.com. 2025年10月21日閲覧。
  4. ↑ The Java Language Specification Second Edition
  5. ↑ “3.9. Keywords - Chapter 3. Lexical Structure - Java SE 9”. docs.oracle.com. 2025年10月20日閲覧。
  6. ↑ Java 10リリース | InfoQ
  7. ↑ “3.9. Keywords - Chapter 3. Lexical Structure - Java SE 14”. docs.oracle.com. 2025年10月20日閲覧。
  8. ↑ “JEP 361: Switch Expressions”. openjdk.org. 2025年10月20日閲覧。
  9. ↑ “3.9. Keywords - Chapter 3. Lexical Structure - Java SE 16”. docs.oracle.com. 2025年10月20日閲覧。
  10. ↑ “3.9. Keywords - Chapter 3. Lexical Structure - Java SE 17”. docs.oracle.com. 2025年10月20日閲覧。
  11. ↑ “3.9. Keywords - Chapter 3. Lexical Structure - Java SE 21”. docs.oracle.com. 2025年10月20日閲覧。
  12. ↑ “JEP 441: Pattern Matching for switch”. openjdk.org. 2025年10月20日閲覧。
  13. ↑ Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)
  14. ↑ Nested Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
  15. ↑ Javaの理論と実践: volatile を扱う, Internet Archive
  16. ↑ Branching Statements (The Java™ Tutorials > Learning the Java Language > Language Basics)
  17. ↑ “13 ローカル変数の型推論 - Java言語更新”. Oracle Help Center. 2025年10月29日閲覧。
  18. ↑ “10 無名変数およびパターン - Java言語更新”. Oracle Help Center. 2025年10月29日閲覧。
  19. ↑ “JEP 456: Unnamed Variables & Patterns”. openjdk.org. 2025年10月29日閲覧。
  20. ↑ “Chapter 15. Expressions - §15.4. FP-strict Expressions”. Java SE 7 Specifications > Java Language Specification. Oracle. 2024年3月5日閲覧。
  21. ↑ オライリー『Binary Hacks』Hack #98 を参照。
  22. ↑ “JEP 306: Restore Always-Strict Floating-Point Semantics”. openjdk.org. 2025年10月21日閲覧。

参考文献