目次
Java®プログラミング言語は、汎用的な同時クラス・ベースのオブジェクト指向言語です。 これは、多くのプログラマが言語の流暢さを達成できるほど単純であるように設計されています。 Javaプログラミング言語はCおよびC++に関連していますが、CおよびC++の多くの側面が省略され、他の言語からのいくつかのアイデアが含まれて、かなり異なる方法で編成されています。 これは、C. A. Rのように、研究言語ではなく本番言語を意図しています。 Hoareは言語デザインに関する彼の古典的な論文で提案し、デザインは、新しくテストされていない機能を含むことを避けました。
Javaプログラミング言語は、強力かつ静的に入力されます。 この指定は、コンパイル時に検出できるコンパイル時エラーと、実行時に発生するコンパイル時エラーを明確に区別します。 コンパイル時間は、通常、プログラムをマシンに依存しないバイトコード表現に変換することから成ります。 ランタイム・アクティビティには、プログラムの実行に必要なクラスのロードとリンク、オプションのマシン・コード生成とプログラムの動的最適化、および実際のプログラム実行が含まれます。
Javaプログラミング言語は比較的高レベルの言語であるため、マシン表現の詳細は言語では使用できません。 これには、(CのfreeまたはC++のdeleteのように)明示的な割当て解除の安全上の問題を回避するために、通常はガベージ・コレクタを使用する自動ストレージ管理が含まれます。 高パフォーマンスのガベージ・コレクト実装では、システム・プログラミングおよびリアルタイム・アプリケーションをサポートするために、無限の休止が発生する可能性があります。 この言語には、索引チェックなしの配列アクセスなどの安全でない構文は含まれません。このような安全でない構文では、プログラムが未指定の方法で動作するためです。
Javaプログラミング言語は通常、The Java Virtual Machine Specification、 Java SE 26 Editionで定義されているバイトコード命令セットおよびバイナリ形式にコンパイルされます。
第2章 では、文法および言語の字句および構文文法の表現について説明します。
第3章 では、CおよびC++++に基づくJavaプログラミング言語の字句構造について説明します。 言語はUnicode文字セットで記述されます。 ASCIIのみをサポートするシステムでは、Unicode文字の書込みをサポートします。
第4章 では、型、値および変数について説明しています。 タイプは、プリミティブ型および参照タイプに分割されます。
プリミティブ型は、すべてのマシンおよびすべての実装で同じになるように定義され、2つの補完整数、IEEE 754浮動小数点数、boolean型およびUnicode文字のchar型の様々なサイズです。 プリミティブ・タイプの値は状態を共有しません。
参照タイプは、クラス・タイプ、インタフェース・タイプおよび配列タイプです。 参照タイプは、クラスまたは配列のインスタンスである動的に作成されるオブジェクトによって実装されます。 各オブジェクトに対して多くの参照が存在します。 すべてのオブジェクト(配列を含む)は、クラス階層の(単一の)ルートであるクラスObjectのメソッドをサポートしています。 事前定義済のStringクラスは、Unicode文字列をサポートしています。 オブジェクト内部のプリミティブ値をラップするためのクラスが存在します。 多くの場合、ラップやラップ解除はコンパイラ(その場合は、ラップをボックス化と呼び、ラップ解除をボックス化と呼びます。)によって自動的に実行されます。 クラスおよびインタフェースは汎用、つまり参照型によってパラメータ化できます。 このようなクラスおよびインタフェースのパラメータ化された型は、特定の型引数を使用して呼び出すことができます。
変数は、型指定された記憶域のロケーションです。 プリミティブ・タイプの変数には、そのプリミティブ・タイプの値が保持されます。 クラス型の変数は、NULL参照、または名前付きクラスのインスタンスであるオブジェクトへの参照、またはそのクラスの任意のサブクラスを保持できます。 インタフェース型の変数には、null参照、または名前付きインタフェースを実装するクラスのインスタンスへの参照を格納できます。 配列型の変数には、null参照または配列への参照を格納できます。 クラス型Objectの変数は、クラス・インスタンスか配列かに関係なく、null参照または任意のオブジェクトへの参照を保持できます。
第5章 では、変換と数値のプロモーションについて説明します。 変換により、コンパイル時タイプが変更されますが、式の値が変更される場合もあります。 これらの変換には、プリミティブ型と参照型間のボックス変換およびアン・ボクシング変換が含まれます。 数値型のプロモーションは、数値演算子のオペランドを、演算を実行できる一般的なタイプに変換するために使用されます。 この言語にはループ穴がありません。参照タイプのキャストは、実行時に型の安全性を確認するためにチェックされます。
第6章 では、宣言と名前、および(つまり、名前を宣言することになります。)を意味する名前の決定方法を説明します。 Javaプログラミング言語では、クラスとインタフェース、またはこれらのメンバーを使用する前に宣言する必要はありません。 宣言順序は、ローカル変数、ローカル・クラス、ローカル・インタフェース、およびクラスまたはインタフェース内のフィールド・イニシャライザの順序にのみ有効です。 ここでは、さらに読みやすいプログラムで使用する、推奨される命名規則について説明します。
第7章 では、パッケージに編成されるプログラムの構造について説明します。 パッケージのメンバーは、クラス、インタフェースおよびサブパッケージです。 パッケージおよびその結果、そのメンバーの階層ネームスペースには名前が付けられています。インターネット・ドメイン名システムは通常、一意のパッケージ名を形成するために使用できます。 コンパイル単位には、指定されたパッケージのメンバーであるクラスおよびインタフェースの宣言が含まれ、他のパッケージからクラスおよびインタフェースをインポートして、これらに短縮名を付けることができます。
パッケージは、非常に大規模なプログラムの構築でブロックとなるモジュールにグループ化できます。 モジュールの宣言により、独自のパッケージにコードをコンパイルおよび実行するために、(パッケージ、クラスおよびインタフェース)で必要な他のモジュールを指定します。
Javaプログラミング言語は、パッケージ、クラスおよびインタフェースのメンバーへの外部アクセスに関する制限をサポートしています。 パッケージのメンバーにアクセスできるのは、同じパッケージ内の他のメンバー、同じモジュールの他のパッケージ内のメンバー、または異なるモジュール内のパッケージのメンバーのみです。 クラスとインタフェースのメンバーにも、同様の制約が適用されます。
第8章 で、クラスについて説明します。 クラスのメンバーは、クラス、インタフェース、フィールド(変数)およびメソッドです。 クラス変数はクラスごとに1回存在します。 クラス・メソッドは、特定のオブジェクトを参照せずに動作します。 インスタンス変数は、クラスのインスタンスであるオブジェクト内で動的に作成されます。 インスタンス・メソッドはクラスのインスタンスに対して起動されます。このようなインスタンスは、オブジェクト指向プログラミング・スタイルをサポートし、その実行時に現在のオブジェクトthisになります。
クラスは、各クラスが1つのスーパークラスを持つ単一の継承をサポートします。 各クラスは、スーパークラスからメンバーを継承し、最終的にはクラスObjectからメンバーを継承します。 クラス型の変数は、指定されたクラスのインスタンスまたはそのクラスの任意のサブクラスを参照できるため、新しいクラスを既存のメソッドと多相的に使用できます。
クラスは、synchronizedメソッドによる同時プログラミングをサポートします。 メソッドはチェック例外を宣言し、その実行によって発生する可能性があります。このため、コンパイル時チェックで例外条件を処理できます。 オブジェクトは、オブジェクトがガベージ・コレクタによって破棄される前に呼び出されるfinalizeメソッドを宣言できるため、オブジェクトの状態をクリーン・アップできます。
簡潔にするため、言語の宣言"ヘッダー"は、クラスの実装とは独立した型の階層とクラスの階層から分離されていません。
制限された種類のクラス(enumクラス)は、小さい値セットの定義と、その操作をタイプ・セーフにサポートします。 他の言語の列挙とは異なり、列挙定数はオブジェクトであり、独自のメソッドを持つ場合があります。
別の制限された種類のクラスであるレコード・クラスは、値の集計として機能する単純なオブジェクトのコンパクトな表現をサポートしています。
第9章 では、インタフェースについて説明します。 インタフェースのメンバーはクラス、インタフェース、定数フィールドおよびメソッドです。 関連のないクラスの場合は、同じインタフェースを実装できます。 インタフェース型の変数には、インタフェースを実装するあらゆるオブジェクトへの参照を含めることができます。
クラスとインタフェースは、インタフェースからの複数の継承をサポートしています。 1つ以上のインタフェースを実装するクラスは、そのスーパー・クラスとスーパー・インタフェースの両方からインスタンス・メソッドを継承できます。
注釈は、プログラム内の宣言、および宣言や式内の型の使用に適用できるメタデータです。 注釈の形式は、特殊な種類のインタフェースである注釈インタフェースによって定義されます。 注釈は、Javaプログラミング言語のプログラムのセマンティクスに影響を与えることは許可されていません。 ただし、各種ツールに役に立つ情報を提供します。
第10章 配列について説明します。 配列アクセスには境界チェックが含まれます。 配列は動的に作成されるオブジェクトであり、Object型の変数に割り当てることができます。 この言語は、多次元配列ではなく配列の配列をサポートしています。
第11章 では、言語セマンティクスおよび同時実行性メカニズムとの間で計画されていない例外と完全に統合されています。 3種類の例外があります: チェックされた例外、ランタイム例外およびエラー。 コンパイラでは、メソッドまたはコンストラクタで宣言された場合にのみ、チェック例外がチェック例外となる可能性があることを要求することで、チェック例外が適切に処理されることが保証されます。 これにより、例外ハンドラが存在するコンパイル時チェックが実行され、大規模なプログラミングが実行されます。 ほとんどのユーザー定義例外をチェックする必要があります。 Java Virtual Machineによって検出されたプログラム内の無効な操作によって、NullPointerExceptionなどの実行時例外が発生します。 エラーは、Java Virtual Machineによって検出された障害(OutOfMemoryErrorなど)によって発生します。 ほとんどの単純なプログラムではエラーを処理しません。
第12章 では、プログラムの実行時に発生するアクティビティについて説明します。 通常、プログラムはコンパイル済のクラスおよびインタフェースを表すバイナリ・ファイルとして格納されます。 これらのバイナリ・ファイルは、Java Virtual Machineにロードし、他のクラスおよびインタフェースにリンクして初期化できます。
初期化後に、クラス・メソッドおよびクラス変数を使用できます。 一部のクラスは、クラス・タイプの新規オブジェクトを作成するためにインスタンス化される場合があります。 クラス・インスタンスであるオブジェクトは、クラスの各スーパークラスのインスタンスも含み、オブジェクトの作成は、これらのスーパークラス・インスタンスの再帰的作成を伴います。
オブジェクトが参照されなくなると、ガベージ・コレクタによって再生されます。 オブジェクトがファイナライザを宣言する場合、オブジェクトが再利用される前にファイナライザが実行され、それ以外の場合は解放されないリソースを最後にクリーンアップできるようになります。 クラスが不要になった場合は、アンロードされる可能性があります。
第13章はバイナリ互換性について説明し、変更されたクラスおよびインタフェースを使用するが再コンパイルされていない他のクラスおよびインタフェースに対するクラスおよびインタフェースの変更による影響を示します。 これらの考慮事項は、多くの場合はインターネットを介して、継続的なバージョンで広く配布されるクラスおよびインタフェースの開発者にとって関心があります。 適切なプログラム開発環境では、クラスまたはインタフェースが変更されるたびに依存コードが自動的に再コンパイルされるため、ほとんどのプログラマはこれらの詳細を気にする必要はありません。
第14章 では、CおよびC++++に基づくブロックおよび文について説明します。 この言語にはgoto文はありませんが、ラベル付きのbreak文とcontinue文が含まれています。 Cとは異なり、Javaプログラミング言語では、制御フロー文にboolean (またはBoolean)式が必要であり、コンパイル時にさらに多くのエラーを検出することを想定して、型を暗黙的にbooleanに変換しません(アンボックス化を除く)。 synchronized文は、基本的なオブジェクト・レベルのモニター・ロックを提供します。 try文には、ローカル以外の制御転送から保護するために、catchおよびfinally句を含めることができます。 第14章では、ローカル変数を条件付きで宣言および初期化するために文(および式)内で使用されるパターンについても説明します。
第15章 式について説明しています。 このドキュメントでは、決定性および移植性を高めるために、式の(明らか)の評価順序を完全に指定します。 オーバーロードされたメソッドとコンストラクタは、適用可能なメソッドまたはコンストラクタから最適な特定のメソッドまたはコンストラクタを選択することにより、コンパイル時に解決されます。
第16章 では、使用前に言語でローカル変数を確実に設定する正確な方法について説明します。 他のすべての変数は自動的にデフォルト値に初期化されますが、Javaプログラミング言語では、マスキング・プログラミング・エラーを回避するためにローカル変数が自動的に初期化されることはありません。
第17章 では、最初にMesaプログラミング言語で導入された監視ベースの並行性に基づいたスレッドおよびロックのセマンティクスについて説明します。 Javaプログラミング言語は、高パフォーマンス実装をサポートする共有メモリー・マルチプロセッサ用のメモリー・モデルを指定します。
第18章 では、汎用メソッドの適用性をテストし、汎用メソッド呼出しで型を推測するために使用される、様々な型の推論アルゴリズムについて説明します。
第19章 では、言語の構文文法を示します。
テキストに示されたサンプル・プログラムのほとんどは、実行の準備ができており、次のような形式です。
class Test {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++)
System.out.print(i == 0 ? args[i] : " " + args[i]);
System.out.println();
}
}
Oracle JDKがインストールされているマシンでは、Test.javaファイルに格納されているこのクラスをコンパイルおよび実行するには、次のコマンドを指定します。
javac Test.java java Test Hello, world.
出力を生成します。
Hello, world.
この仕様全体を通して、Java SE Platform APIから作成されたクラスおよびインタフェースを参照します。 単一の識別子Nを使用してクラスまたはインタフェース(例で宣言されているもの以外)を参照する場合、意図した参照は、パッケージjava.langのNという名前のクラスまたはインタフェースです。 java.lang以外のパッケージのクラスまたはインタフェースには、正規名(§6.7)を使用します。
この仕様内の相互参照は(§x.y)と表示されます。 フォーム(JVMS§x.y)の相互参照を介して、The Java Virtual Machine Specification、 Java SE 26 Editionの概念を参照することがあります。
この仕様の規範的なテキストを明確にするために設計された非規範的なテキストは、より小さくインデントされたテキストで示されます。
これは非正規テキストです。 それは直感、論理、助言、例、等を提供します。
一部のルール、特にJavaプログラミング言語の構成を体系的に分析するルールの説明を短縮するために、慣習的な略称「iff」は「if and only if」を意味するために使用されます。
Javaプログラミング言語の型システムは、時折置換の概念に依存します。 表記 [F1:=T1,...,Fn:=Tn]は、Fiの Tiによる1 ≤ i ≤ nへの置換を示します。
前述のように、この仕様は、Java SE Platform APIのクラスとインタフェースを指すことがよくあります。 特に、一部のクラスとインタフェースは、Javaプログラミング言語と特別な関係があります。 たとえば、Object、Class、ClassLoader、String、Threadなどのクラス、およびパッケージjava.lang.reflect内のクラスとインタフェースなどです。 この仕様は、そのようなクラスとインタフェースの動作を制約しますが、それらの完全な仕様は提示しません。 読者は、Java SE Platform APIのドキュメントを参照してください。
したがって、この仕様にはリフレクションの詳細な説明はありません。 多くの言語構造は、Core Reflection API (java.lang.reflect)およびLanguage Model API (javax.lang.model)に類似していますが、通常はここでは説明しません。 たとえば、オブジェクトを作成する方法をリストする場合、通常、これをコア・リフレクションAPIで実現する方法は含めていません。 読者は、テキストに記載されていなくても、それらの追加のメカニズムに注意する必要があります。
プレビュー機能は次のとおりです:
Javaプログラミング言語の新機能(「プレビュー言語機能」)
Java Virtual Machineの新機能(「VMのプレビュー機能」)
java.*またはjavax.*ネームスペースの新しいモジュール、パッケージ、クラス、インタフェース、フィールド、メソッド、コンストラクタまたはenum定数(「プレビューAPI」)
これは完全に指定され、完全に実装され、かつ不完全です。 これは、Java SEプラットフォームの特定のリリースの実装で使用でき、実際の使用に基づいた開発者のフィードバックを求めています。これにより、Java SEプラットフォームの将来のリリースで永続的になる可能性があります。
特定のリリースのJava SEプラットフォームで定義されたプレビュー機能は、そのリリースのJava SEプラットフォーム仕様に列挙されています。 プレビュー機能は次のように指定します:
プレビュー言語機能は、そのリリースのThe Java®Language Specificationへの変更(diffs)を示すスタンドアロン・ドキュメントで指定されます。 プレビュー言語機能の仕様は、The Java®Language Specificationに組み込まれており、コンパイル時にプレビュー機能が有効化されている場合のみ、その一部を構成します。
プレビューVM機能は、そのリリースのThe Java®Virtual Machine Specificationへの変更(「diffs」)を示すスタンドアロン・ドキュメントで指定されます。 プレビューVM機能の仕様は、参照によりJava®仮想マシン仕様に組み込まれており、実行時にプレビュー機能が有効化されている場合のみ、その一部を構成します。
プレビューAPIは、そのリリースのJava SE API仕様内に指定されています。
Java SEプラットフォームの実装では、コンパイル時と実行時の両方で、特定のリリースで定義されたプレビュー機能は無効になります。ただし、ユーザーがホスト・システムを介して指定した場合は、コンパイル時と実行時の両方で、そのプレビュー機能が有効になります。 実装では、特定のリリースのプレビュー機能の一部のみを有効にする方法は提供されません。
コンパイル時には、プレビュー言語機能を使用するためのルールは次のとおりです。
プレビュー機能が無効になっている場合、プレビュー言語機能へのソース・コード参照、またはプレビュー言語機能を使用して宣言されたクラスまたはインタフェースを参照すると、コンパイル時にエラーが発生します。
プレビュー機能が有効になっている場合、プレビュー言語機能を使用して宣言されたクラスまたはインタフェースへのソース・コード参照により、次のいずれかが当てはまる場合を除き、プレビュー警告が発生します。
プレビュー機能が有効になっている場合、Javaコンパイラでは、ソース・コードでプレビュー言語機能に参照するたびに抑制できない警告を表示することが推奨されます。 この警告の詳細は、この仕様の範囲外ですが、プレビュー言語機能に対する将来の変更によってコードが影響を受ける可能性があることをプログラマに警告することを目的とします。
一部のプレビューAPIは、Java SEプラットフォーム仕様(主にjava.lang.reflect、java.lang.invokeおよびjavax.lang.modelパッケージ)によって反射と記述されています。 コンパイル時に、リフレクティブ・プレビューAPIを使用するためのルールは次のとおりです。
プレビュー機能が有効か無効かに関係なく、次のいずれかに該当しないかぎり、リフレクティブ・プレビューAPI要素へのソース・コード参照によってプレビュー警告が発生します。
参照が表示される宣言は、リフレクティブ・プレビューAPI要素の宣言と同じモジュール内にあります。
参照は、プレビュー警告を抑制する注釈付き宣言に表示されます。
参照がインポート宣言に表示されます。
Java SEプラットフォーム仕様でリフレクティブとして記述されていないプレビューAPIはすべて正常です。 コンパイル時に、通常のプレビューAPIを使用するためのルールは次のとおりです。
プレビュー機能が無効になっている場合、次の場合を除き、通常のプレビューAPI要素へのソース・コード参照によってコンパイル時エラーが発生します。
参照が表示される宣言は、通常のプレビューAPI要素の宣言と同じモジュール内にあります。
プレビュー機能が有効になっている場合、次のいずれかに該当しないかぎり、通常のプレビューAPI要素へのソース・コード参照によってプレビュー警告が発生します。
参照が表示される宣言は、通常のプレビューAPI要素の宣言と同じモジュール内にあります。
参照は、プレビュー警告を抑制する注釈付き宣言に表示されます。
参照がインポート宣言に表示されます。
Java SE 26では、1つのプレビュー言語機能が定義されています。
パターン、instanceofおよびswitchのプリミティブ型
このプレビュー機能を指定するスタンドアロン・ドキュメントは、このエディションのThe Java®Language SpecificationをホストするWebサイトで入手できます。
読者は、Java®言語仕様の技術的なエラーやあいまいさをjls-jvms-spec-comments@openjdk.orgに報告するよう招待されています。
javacの動作(Javaプログラミング言語の参照コンパイラ)および特にこの仕様への準拠に関する質問は、compiler-dev@openjdk.orgに送信できます。
Appleコンピュータ Dylan Reference Manual Apple Computer Inc.、Cupertino、カリフォルニア州。 1995年9月29日。
Bobrow、Daniel G.、Linda G. DeMichiel、Richard P. Gabriel, Sonya E. Keene、Gregor Kiczales、David A。 ムーン文字 Common Lisp Object System Specification, X3J13 Document 88-002R, June 1988; Chapter 28 of Steele, Guy. Common Lisp: The Language、第2版。 Digital Press, 1990, ISBN 1-55558-041-6, 770-864.
Ellis、Margaret A.、Bjarne Stroustrup。 Annotated C++リファレンス・マニュアル。 Addison-Wesley, Reading, Massachusetts, 1990, reprinted with corrections October 1992, ISBN 0-201-51459-1.
Goldberg、Adele、Robson、David Smalltalk-80: 言語 Addison-Wesley, Reading, Massachusetts, 1989, ISBN 0-201-13688-0.
ハービソン、サミュエル Modula-3。 Prentice Hall, Englewood Cliffs, New Jersey, 1992, ISBN 0-13-596396.
Hoare, C. A. R. プログラミング言語の設計に関するヒント。 スタンフォード大学コンピュータサイエンス学科技術報告番号CS-73-403、1973年12月。 SIGACT/SIGPLAN Symposium on Principles of Programming Languageに掲載されました。 Association for Computing Machinery、ニューヨーク、 1973年
IEEE。 IEEE Standard for Floating-Point Arithmetic IEEE Std 754-2019 (IEEE 754-2008の改訂) 2019年7月、ISBN 978-1-5044-5924-2。
Kernighan、Brian W.、Dennis M. Ritchie 「Cプログラミング言語」、第2版。 Prentice Hall, Englewood Cliffs, New Jersey, 1988, ISBN 0-13-110362-8.
Madsen、Ole Lehrmann、BirgerMøller-Pedersen、Kristen Nygaard。 ベータ・プログラミング言語でのオブジェクト指向プログラミング。 Addison-Wesley, Reading, Massachusetts, 1993, ISBN 0-201-62430-3.
ミッチェル、ジェームズ・G、ウィリアム・メイベリー、リチャード・スウィート The Mesa Programming Language、 Version 5.0。 Xerox PARC, Palo Alto, California, CSL 79-3, April 1979.
Stroustrup、Bjarne。 C++プログラミング言語の第2版。 Addison-Wesley、Reading、Massachusetts、1991年、1994年1月、ISBN 0-201-53992-6で再印刷されました。
Unicode Consortium、 Unicode標準、バージョン17.0.0。 南サンフランシスコ:Unicode Consortium、2025年 ISBN 978-1-936213-35-1。