※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

1. はじめに

1.1. 仕様の構成

2章では、言語の字句と構文文法を表す文法と表記法について記述します。

3章では、CやC++に基づいたJavaプログラミング言語の字句構造について記述します。言語はUnicode文字セットで記述します。言語はASCIIのみをサポートするシステム上でもUnicode文字をサポートします。

4章では、型や値や変数について記述します。型はプリミティブ型と参照型に分けられます。
プリミティブ型は全てのマシンと全ての実装で同一なものが定義されており、多様なサイズの2の補数の整数や、単精度・倍精度IEEE754規格浮動小数点数、boolean型、Unicode文字char型が定義されています。プリミティブ型はステートを共有しません。
参照型はクラス型やインタフェース型や配列型です。参照型はクラスのインスタンスか配列のいずれかの動的作成オブジェクトによって実装されています。一つのオブジェクトに対し複数から参照することが可能です。全てのオブジェクト(配列を含む)はクラス階層の(唯一の)ルートであるObjectクラスのメソッドをサポートします。組込みStringクラスはUnicode文字列をサポートします。プリミティブ値をオブジェクト内にラッピングするためのクラスがあります。多くの場合、ラッピング・ラッピング解除はコンパイラによって自動的に実行されます(この場合、ラッピングをボックス化、ラッピング解除をボックス化解除と呼びます)。クラスとインタフェース宣言はジェネリックであっても構いません。つまり、それらは他の参照型を用いる引数が付いていても構いません。そのような宣言は通常特定の型実引数を伴って呼び出します。
変数とは型付けされた記憶領域です。プリミティブ型の変数は同じプリミティブ型の値を保持します。クラス型の変数はヌル参照か型がそのクラス型かそのクラスの任意のサブクラスであるオブジェクトへの参照を保持できます。インタフェース型の変数はヌル参照かそのインタフェースを実装する任意のクラスのインスタンスへの参照を保持することができます。配列型の変数はヌル参照か配列への参照を保持することができます。Objectクラス型の変数はヌル参照かクラスインスタンスや配列のどちらのオブジェクトへの参照も保持できます。

5章では、変換と数値昇格について記述します。変換はコンパイル時の型を、場合によっては式の値も変更します。この変換にはプリミティブ型と参照型の間のボックス化・ボックス化解除変換が含まれます。数値昇格は数値演算子のオペランドを演算が実行される共通型へと変換するためのものです。Javaには抜け穴はありません。参照型のキャストは型の安全性が確保されているか実行時に検査されます。

6章では、宣言と名前、名前が何を意味するものかを決定する方法について記述します。Javaでは型やメンバーを使う前にそれらが定義されている必要はありません。宣言の順序は局所変数や局所クラス、クラスやインスタンス内のフィールドの初期化子の順序の場合のみ重要です。
Javaプログラミング言語は名前のスコープに対する制御を提供しており、パッケージやクラスやインタフェースのメンバーに対する外部アクセスの制限をサポートしています。これにより巨大なプログラムを書く際に型の実装をそれを使用する人や拡張する人から独立させることができます。プログラムを読みやすくする標準的な名前付けもここで記述します。

7章では、Modulaのモジュールに似たパッケージで構成される、プログラムの構造を記述します。パッケージのメンバーはクラスとインタフェースとサブパッケージです。パッケージはコンパイル単位に分割されます。コンパイル単位は型宣言を含み短い名前を与えて他のパッケージから型をインポートすることができます。パッケージは階層構造の名前空間内に名前を持ち、一意なパッケージ名を与えるためにインターネットのドメインネームシステムを使用することができます。

8章では、クラスについて記述します。クラスのメンバーはクラスやインタフェースやフィールド(変数)やメソッドです。クラス変数はクラスにつき1つ存在します。クラスメソッドは特定のオブジェクトへの参照なしに動作します。インスタンス変数はクラスのインスタンスであるオブジェクト内に動的に作成されます。インスタンスメソッドはクラスのインスタンス上で呼び出されます。そのようなインスタンスはその実行中に現オブジェクトthisとなり、オブジェクト指向プログラミングスタイルをサポートします。
クラスは実装の単一継承をサポートします。個々のクラスの実装は単一のスーパークラスの実装、究極的にはクラスObjectから継承されます。クラス型の変数はそのクラスまたは、新しい型が既存のメソッドで使用することができるよう、そのクラスのサブクラスのインスタンスを多相的に参照することができます。
クラスはsynchronizedメソッドにより並行プログラミングをサポートします。メソッドは実行時に発生する検査済み例外を宣言します。これにより例外条件の処理が確実に行っているかコンパイル時に検査されます。オブジェクトはガーベージコレクターによってオブジェクトが解放される前に呼び出されるfinalizeメソッドを宣言します。これによりオブジェクトがそのステートを綺麗に片づけることができます。
簡単化のため、言語はそのクラスの実装から分離した"ヘッダー"宣言を持たなく、型とクラスの階層構造も持ちません。
クラスの特別形の1つ、列挙子は値の小集合の定義と型安全な記述によってその運用をサポートします。他の言語の列挙子と異なり、Javaの列挙子はオブジェクトでそれ自身メソッドを持ちます。

9章では、抽象メソッドやメンバー型や定数を宣言するインタフェース型について記述します。無関係のクラスでも同じインタフェース型を実装できます。インタフェース型の変数はそのインタフェースを実装するすべてのオブジェクトへの参照を保持することができます。複数インタフェースの継承は可能です。
注釈型は宣言を注釈するのに用いる特殊なインタフェースです。そのような注釈はJavaプログラミング言語で書かれたプログラムの意味にわずかも影響を与えません。しかしながら、それらは様々なツールに便利な情報を与えます。

10章では、配列について記述します。配列アクセスは境界検査を含んでいます。配列は動的に作成されたオブジェクトでObject型の変数に代入が可能です。言語は多次元配列よりもむしろ配列の配列をサポートします。

11章では、レジューム不可で言語的意味と並行機構と統合された例外について記述します。例外には3つの種類があります。検査済み例外、実行時例外、エラーです。コンパイラーはメソッドやコンストラクターが定義した検査済み例外のみを出力すること確認して、検査済み例外が適切に処理されることを保証します。これはコンパイル時に例外ハンドラ―が存在することを検査し大規模プログラミングを手助けします。ユーザー定義例外の大部分は検査済み例外であるはずです。プログラム中の不正な演算はJava仮想マシンによって検出され、NullPointerExceptionのような実行時例外が出力されます。エラーはJava仮想マシンが検出する、例えばOutOfMemoryErrorのような、失敗が出力されます。大多数の簡単なプログラムはエラーを処理しません。

12章では、プログラムの実行中に発生するアクティビティについて説明します。プログラムはコンパイルされたクラスやインタフェースを表すバイナリ―ファイルとして通常は保存されています。このバイナリーファイルはJava仮想マシンにロードされて他のクラスやインタフェースとリンクされ初期化されます。
初期化された後にクラスメソッドとクラス変数は使用されます。いくつかのクラスはクラス型の新しいオブジェクトを作成するためにインスタンス化されます。クラスインタフェースであるオブジェクトもまたクラスのスーパークラス毎のインスタンスを持ちます。オブジェクト作成はスーパークラスのインスタンスの再帰的作成を含みます。
オブジェクトがもはや参照されなくなったら、ガーベージコレクターによって回収されるかもしれません。オブジェクトが終了化子を宣言していたら、オブジェクトが回収される前にそのオブジェクトが他で開放していないリソースを綺麗に片づける最後の機会を与えるため、その終了化子は実行されます。クラスがもはや必要でなくなった場合、クラスはロード解除されます。

13章では、変更された型を再コンパイルせず使用できる他の型に対して、型変更の影響を明記しながら、バイナリ―互換性について記述します。このような検討はしばしばインターネットを通して、バージョンを重ねながら、広く配布される型の開発者にとって興味深いものです。良いプログラム開発環境は型が変更される時に自動的に依存するコードを再コンパイルします。これによりたいていのプログラマーはこのような詳細を気にする必要はありません。

14章では、CやC++に基づくブロックと文について記述します。言語にはgoto文はありませんが、ラベル付きbreakcontinueがあります。Cとは異なり、Javaプログラミング言語はboolean(もしくはBoolean)式を制御フロー文において要求し、型の暗黙的なbooleanへの変換(ボックス化解除を除く)を行わず、コンパイル時にエラーを出力します。synchronized文は基本的なオブジェクトレベルでのモニターロッキングを提供します。try文はcatchfinally節を含み、非局所的制御遷移から守ります。

15章では、式について記述します。決定性と移植性向上のために、本ドキュメントでは式の(自明な)評価順序を完全に明記します。オーバーロードされたメソッドやコンストラクターは、適用可能なものの中から最も具体的なメソッドが選択されることによって、コンパイル時に解決されます。

16章では、言語が局所変数を使用する前に確実に設定することを保証する適切な方法について記述します。Javaプログラミング言語はプログラミングエラーを隠してしまうことを防ぐため局所変数を自動的に初期化しません。他の全ての変数はデフォルト値に自動的に初期化します。

17章では、もともとMesaプログラミング言語で導入されたモニターベースの並行処理に基づくスレッドとロックの意味論について記述します。Javaプログラミング言語は高性能な実装をサポートする共有メモリー型マルチプロセッサー用のメモリーモデルを明確にしています。

18章では、言語の構文文法を記述します。

1.2. プログラム例

1.3. 記法

1.4. 組込みクラスやインタフェースとの関係

1.5. 参考文献