目次 | 前 | 次 | 索引 | Java言語規定 第2版 |
12.では,プログラムの実行中に発生する活動を規定する。12.は,Java仮想計算機,並びにプログラムを形成する,クラス,インタフェース及びオブジェクトのライフサイクルに関して示す。
Java仮想計算機は,指定されたクラスをロードし,この指定されたクラスにおけるメソッドmain
を呼び出すことによって,処理を開始する。12.1では,main
の実行に含まれるロード,リンク及び初期化の段階を,12.における諸概念の導入として概説する。それ以降では,ロード(12.2),リンク(12.3)及び初期化(12.4)の詳細を規定する。
main
in this specified class. Section §12.1 outlines the loading, linking, and initialization steps involved in executing main
, as an introduction to the concepts in this chapter. Further sections specify the details of loading (§12.2), linking (§12.3), and initialization (§12.4).12.では,続けて,新しいクラスインスタンスの生成(12.5),クラスインスタンスの終了(12.6)の手続きを規定する。最後に,クラスのアンロード(12.7)及びプログラムが処理を抜けるときの手続き(12.8)を規定する。
main
を呼び出し,文字列の配列である一つの引数をそのメソッドに渡すことによって,実行を開始する。この規定の例では,この最初のクラスを典型的にTest
と呼ぶことにする。
main
of some specified class, passing it a single argument, which is an array of strings. In the examples in this specification, this first class is typically called Test
.仮想計算機の開始についての正確な意味は,The Java Virtual Machine Specification, Second Edition の5.で与えられる。12.1では,Javaプログラム言語の観点から,処理の概観を示す。
開始のクラスをJava仮想計算機に指定する方法はこの規定の範囲外とするが,コマンド行を使用するホスト環境では,コマンド行の引数の一つとしてクラスの完全限定名を指定し,それに続くコマンド行の引数をメソッドmain
への引数として与える文字列として使用することが,典型的である。例えば,UNIXでの実装では,コマンド行は次のとおりとなる。
main
. For example, in a UNIX implementation, the command line:
これは,クラスjava Test reboot Bob Dot Enzo
Test
(これは,名前無しパッケージにおけるクラスである。)のメソッドmain
を呼び出し,そのクラスに四つの文字列"reboot"
, "Bob"
, "Dot"
及び"Enzo"
を含む一つの配列を渡すことによって,Java仮想計算機を開始することになる。
main
of class Test
(a class in an unnamed package), passing it an array containing the four strings "reboot"
, "Bob"
, "Dot"
, and "Enzo"
.
次に,仮想計算機がTest
を実行するために行う処理の段階の概略を,ロード処理,リンク処理及び初期化処理の例として示す。これらの処理の詳細は,12.2から12.4で述べる。
Test
, as an example of the loading, linking, and initialization processes that are described further in later sections.Test
のロード
Test
のメソッドmain
を実行しようとする最初の試みでは,クラスTest
がロードされていないこと,すなわち,仮想計算機が現時点でこのクラスに対するバイナリ表現を含まないことを発見する。そして,仮想計算機は,クラスローダを使用して,そのバイナリ表現を見つけようと試みる。この処理が失敗する場合には,エラーが投げられる。このロード処理は,12.2で詳しく示す。
main
of class Test
discovers that the class Test
is not loaded-that is, that the virtual machine does not currently contain a binary representation for this class. The virtual machine then uses a class loader to attempt to find such a binary representation. If this process fails, then an error is thrown. This loading process is described further in §12.2.Test
のリンク: 検証,準備及び(オプションの)記号解決
Test
をロードした後,main
を呼び出す前に,Test
を初期化しなければならない。さらに,Test
は,すべての(クラス又はインタフェース)型と同様に,初期化の前にリンクされなければならない。リンクには,検証,準備及び(オプションの)記号解決を含む。リンクは,12.3で詳しく示す。
Test
is loaded, it must be initialized before main
can be invoked. And Test
, like all (class or interface) types, must be linked before it is initialized. Linking involves verification, preparation and (optionally) resolution. Linking is described further in §12.3.
検証は,Test
のロードされた表現が,適切な記号表をもった正しい形式であるか検査する。検証は,さらに,Test
を実装するコードが,Javaプログラム言語及びJava仮想計算機の意味要件に従っているかも検査する。検証中に問題を検出した場合は,エラーが投げられる。検証は,12.3.1で詳しく示す。
Test
is well-formed, with a proper symbol table. Verification also checks that the code that implements Test
obeys the semantic requirements of the Java programming language and the Java virtual machine. If a problem is detected during verification, then an error is thrown. Verification is described further in §12.3.1.準備は,静的記憶領域の割当て,及びメソッド表などの仮想計算機によって内部的に使用されるデータ構造の割当てを含む。準備は,12.3.2で詳しく示す。
記号解決は,記述された他のクラス及びインタフェースをロードし,参照が正しいことを検査することによって,Test
から他のクラス及びインタフェースへの記号参照を検査する処理とする。
Test
to other classes and interfaces, by loading the other classes and interfaces that are mentioned and checking that the references are correct.
記号解決の段階は,初期のリンク時にはオプションとする。実装によっては,非常に早い段階でリンクされることになっているクラス又はインタフェースからの記号参照を解決してもよい。これには,再帰的に参照されるクラス及びインタフェースからの記号参照すべての解決を含んでもよい。(ただし,この記号解決は,以降のロード及びリンクにおいてエラーを生じるかもしれない。)この実装の選択は極端な例であるが,C言語の単純な実装で長年行われてきた"静的"リンクの種類に類似している。(これらの実装では,コンパイルされたプログラムは,通常"a.out
"ファイルとして表現する。このファイルは,そのプログラムが使用するライブラリルーチンへの完全に解決されたリンクを含んだ,プログラムの完全にリンクされた版を保持している。これらライブラリルーチンのコピーが,"a.out
"ファイルに含まれている。)
a.out
" file that contains a fully-linked version of the program, including completely resolved links to library routines used by the program. Copies of these library routines are included in the "a.out
" file.)この代わりに,実装によっては,記号参照を実際に使用する場合にだけ解決する方法を選択してもよい。すべての記号参照に対してこの戦略を一貫して使用すると,"もっとも怠慢な"形式の記号解決になる。
この場合,Test
が他のクラスへの幾つかの記号参照をもっていたとすると,それらの参照を使用するときに,一度に一つ解決するかもしれないし,プログラムの実行中にそれらの参照を一度も使用しなければ,全く解決しないかもしれない。
Test
had several symbolic references to another class, then the references might be resolved one at a time, as they are used, or perhaps not at all, if these references were never used during execution of the program.
記号解決を実行するときのただ一つの要件は,記号解決中にエラーを検出した場合,そのエラーに関連するクラス又はインタフェースへのリンクを直接的に又は間接的に要求するかもしれないプログラムが動作を実行する箇所で,そのエラーを投げなければならないこととする。上記の"静的な"実装選択の例では,クラスTest
において記述されているクラス若しくはインタフェース,又はさらなる再帰的に参照されるクラス及びインタフェースにロード及びリンクのエラーが関連するとしたら,これらエラーは,プログラムが実行される前に発生可能となる。"もっとも怠慢な"記号解決を実装したシステムでは,不正な記号参照を実際に使用した場合にだけ,これらのエラーが投げられる。
Test
or any of the further, recursively referenced, classes and interfaces. In a system that implemented the "laziest" resolution, these errors would be thrown only when an incorrect symbolic reference is actively used.記号解決の過程の詳細については,12.3.3で示す。
Test
の初期化: 初期化子の実行
Test
のメソッドmain
を実行しようとしているところである。これは,そのクラスを初期化した場合(12.4.1)にだけ実行できる。
main
of class Test
. This is permitted only if the class has been initialized (§12.4.1).
初期化は,あらゆるクラス変数の初期化子及びクラスTest
の静的初期化子を,記述した順序で実行することから成る。しかし,Test
が初期化可能となる前に,直接的上位クラスを初期化しなければならない。同様に,その直接的上位クラスの直接的上位クラスが存在する場合は,それを初期化しなければならない。以降も再帰的に同様とする。もっとも単純な場合は,Test
が,暗黙的な直接的上位クラスとしてObject
をもつ。クラスObject
をまだ初期化していない場合には,それをTest
よりも前に初期化しなければならない。クラスObject
は上位クラスをもたないので,再帰はここで終了する。
Test
, in textual order. But before Test
can be initialized, its direct superclass must be initialized, as well as the direct superclass of its direct superclass, and so on, recursively. In the simplest case, Test
has Object
as its implicit direct superclass; if class Object
has not yet been initialized, then it must be initialized before Test
is initialized. Class Object
has no superclass, so the recursion terminates here.
クラスTest
に上位クラスとしてクラスSuper
がある場合,Test
よりも前にSuper
を初期化しなければならない。これには,Super
のロード,検証及び準備が必要であって,実装によっては,Super
及び同様に再帰的に続く上位クラスからの記号参照の解決を含んでもよい。
Test
has another class Super
as its superclass, then Super
must be initialized before Test
. This requires loading, verifying, and preparing Super
if this has not already been done and, depending on the implementation, may also involve resolving the symbolic references from Super
and so on, recursively.したがって,初期化では,他の型に関連するエラーなどを含んだ,ロード,リンク及び初期化のエラーが発生するかもしれない。
初期化の過程の詳細については,12.4で示す。
Test.main
の呼出し
Test
の初期化(この初期化中に,他のロード,リンク及び初期化が結果として生じるかもしれない。)が完了した後で,Test
のメソッドmain
を呼び出す。
Test
(during which other consequential loading, linking, and initializing may have occurred), the method main
of Test
is invoked.
メソッドmain
は,public
,static
及びvoid
として宣言しなければならない。このメソッドは,文字列の配列である単一の実引数を受理しなければならない。
main
must be declared public
, static
, and void
. It must accept a single argument that is an array of strings.Class
オブジェクトを構築する過程を意味する。この場合,バイナリ形式の見つけ出しは,恐らくその実行の最中に計算することによっても可能だが,より典型的には,コンパイラによってあらかじめソ−スコ−ドから計算されたバイナリ表現を検索することによって実行される。
Class
object to represent the class or interface.ロードの正確な意味は,The Java Virtual Machine Specification, Second Edition の5.で与えられる。12.2では,Javaプログラム言語の観点からその処理の概要を示す。
クラス又はインタフェースのバイナリ形式は,通常,前段落で示した The Java Virtual Machine Specification, Second Edition で示されたclass
ファイル形式とする。しかし,13.1に規定される要件を満たしていれば,他の形式も可能とする。クラスClassLoader
のメソッドdefineClass
を使用して,class
ファイル形式のバイナリ表現からClass
オブジェクトを構築できる。
class
file format described in The Java Virtual Machine Specification cited above, but other formats are possible, provided they meet the requirements specified in §13.1. The method defineClass
of class ClassLoader
may be used to construct Class
objects from binary representations in the class
file format.
これらの課題のより詳細に関しては,The Java Virtual Machine Specification, Second Edition を参照するか,ACM SIGPLAN Notices, Volume 33, Number 10, October 1998として出版されている Proceedings of OOPSLA '98 の36ページ〜44ページにあるSheng Liang及びGilad Brachaの論文 Dynamic Class Loading in the Java Virtual Machine を参照すること。Javaプログラム言語の設計の基本原理は,型システムが,その言語で記述されたコードによって,特にClassLoader
及びSecurityManager
といった普通ならば影響を与えやすいシステムクラスの実装によってさえも,破壊されることがないということとする。
ClassLoader
and SecurityManager
. ClassLoader
及びその下位クラスによって実装される。ClassLoader
の異なる下位クラスは,異なるロードの方針を実装してもよい。特に,クラスローダは,クラス及びインタフェースのバイナリ表現をキャッシュし,予想される使用方法に基づいてそれらを事前に取り出し,関係するクラスのグループを一緒にロードしてよい。これらの活動は,実行中のアプリケーションに対して完全に透過的でなくてもよい。例えば,クラスローダが古い版をキャッシュしているので,新たにコンパイルした版が見つからないような場合もある。しかし,ロードエラーが事前取出し又はグループロードを行わない場合にも発生する可能性があるプログラムにおいて,その場所でだけ,そのエラーを反映するのは,クラスローダの責任とする。
ClassLoader
and its subclasses. Different subclasses of ClassLoader
may implement different loading policies. In particular, a class loader may cache binary representations of classes and interfaces, prefetch them based on expected usage, or load a group of related classes together. These activities may not be completely transparent to a running application if, for example, a newly compiled version of a class is not found because an older version is cached by a class loader. It is the responsibility of a class loader, however, to reflect loading errors only at points in the program they could have arisen without prefetching or group loading.
クラスをロード中にエラーが発生した場合には,その型を(直接的に又は間接的に)使用するプログラムの中の任意の場所で,クラスLinkageError
の下位クラスの次のいずれか一つのインスタンスが投げられる。
LinkageError
will be thrown at any point in the program that (directly or indirectly) uses the type:
ClassCircularityError:
クラス又はインタフェースが,それ自体の上位クラス又は上位インタフェース(13.4.4)なのでロードできなかった。
ClassCircularityError
: A class or interface could not be loaded because it would be its own superclass or superinterface (§13.4.4).ClassFormatError:
要求したコンパイル済みのクラス又はインタフェースを指定するバイナリデータの形式が不正である。
ClassFormatError
: The binary data that purports to specify a requested compiled class or interface is malformed.NoClassDefFoundError:
要求したクラス又はインタフェースの定義を,関連するクラスローダが見つけることができなかった。
NoClassDefFoundError
: No definition for a requested class or interface could be found by the relevant class loader.OutOfMemoryError
で失敗することもある。
OutOfMemoryError
.リンクは,検証,準備及び記号参照解決の三つの異なる処理を含む。リンクの正確な意味は,The Java Virtual Machine Specification, Second Edition の5.で与えられる。12.3では,Javaプログラム言語の観点から処理の概要を示す。
この規定では,リンク処理(及びそれに関係するロード処理)を実行する時について,実装に柔軟性を与えている。ただし,言語の意味規則を守ること,クラス又はインタフェースの初期化の前に完全に検証及び準備をすること,並びにリンク中に検出したエラーを,そのエラーに関連するクラス又はインタフェースへのリンクを要求するかもしれないプログラムが動作を実行した時点で投げること,という条件を満たすものとする。
例えば,実装では,クラス又はインタフェースにおける各記号の参照を,それを使用した場合にだけ個々に解決する(怠慢解決又は遅延解決)か,又はクラスを検証しているときに一度にすべてを解決する(静的解決)かのいずれを選択してもよい。これは,実装によっては,クラス又はインタフェースを初期化した後でも解決処理が継続する場合があることを意味する。
リンクは,新しいデータ構造の割当てを含むので,OutOfMemoryError
で失敗することもある。
OutOfMemoryError
.検証処理の規定に関しては,The Java Virtual Machine Specification, Second Edition を参照すること。
検証中にエラーが発生した場合は,プログラムにおける,そのクラスの検証を引き起こした場所で,クラスLinkageError
の下位クラスである次のインスタンスが投げられる。
LinkageError
will be thrown at the point in the program that caused the class to be verified:
VerifyError:
クラス又はインタフェースのバイナリ定義が,Java仮想計算機の意味規則に従っていること,及びJava仮想計算機の完全性を破壊できないこと,を検証するために必要とされる検査項目の集合に合格しなかった。例については,13.4.2, 13.4.4, 13.4.8及び13.4.15を参照すること。
VerifyError
: The binary definition for a class or interface failed to pass a set of required checks to verify that it obeys the semantics of the Java virtual machine language and that it cannot violate the integrity of the Java virtual machine. (See §13.4.2, §13.4.4, §13.4.8, and §13.4.15 for some examples.)static
フィールド(クラス変数及びクラス定数)の生成及びそれらフィールドのデフォルト値への初期化(4.5.5)を含む。準備では,ソースコードの実行を要求しない。static
フィールドの明示的な初期化子は,準備ではなく初期化(12.4)の一部として実行される。
static
fields (class variables and constants) for a class or interface and initializing such fields to the default values (§4.5.5). This does not require the execution of any source code; explicit initializers for static
fields are executed as part of initialization (§12.4), not preparation.Java仮想計算機の実装は,クラス又はインタフェースにおける後の操作をより効率的にするために.準備の時に付加的なデータ構造を事前に計算してもよい。特に役に立つデータ構造としては,"メソッド表"又はクラスのインスタンスにおいてメソッドを起動する時に上位クラスの検索を要求することなしに起動可能とする他のデータ構造がある。
記号参照が使用可能となる前に,解決(resolution)を行わなければならない。解決において,記号参照が正しいことが検査され,通常は,その参照が再帰的に使用されている場合には,より効率的に処理可能な直接的参照に置換する。
解決中にエラーが発生した場合は,エラーが投げられる。通常このエラ−は,クラス IncompatibleClassChangeError
の次に示す下位クラスのうちの一つのインスタンスとするが,クラスIncompatibleClassChangeError
のこれ以外の下位クラスのインスタンスであってもよいし,クラスIncompatibleClassChangeError
それ自体のインスタンスであってもよい。このエラーは,その型への記号参照を直接的に又は間接的に使用するプログラムにおける任意の時点で投げられてよい。
IncompatibleClassChangeError
, but it may also be an instance of some other subclass of IncompatibleClassChangeError
or even an instance of the class IncompatibleClassChangeError
itself. This error may be thrown at any point in the program that uses a symbolic reference to the type, directly or indirectly:
IllegalAccessError
:
フィールドの使用若しくは代入,メソッドの起動又はクラスのインスタンスの生成を指定する記号参照を検出したが,その参照を含むコードがそれらにアクセスできない。その理由としては,そのフィールド又はメソッドを,private
,protected
若しくは(public
ではない)デフォルトアクセスとして宣言していたため,又はそのクラスをpublic
として宣言していなかったためによる。
IllegalAccessError
: A symbolic reference has been encountered that specifies a use or assignment of a field, or invocation of a method, or creation of an instance of a class, to which the code containing the reference does not have access because the field or method was declared private
, protected
, or default access (not public
), or because the class was not declared public
. public
として宣言していたフィールドを,そのフィールドを参照する他のクラスをコンパイルした後で,private
に変更した場合に発生する(13.4.6)。
public
is changed to be private
after another class that refers to the field has been compiled (§13.4.6).
InstantiationError
:
クラスのインスタンス生成式の中で使用している記号参照を検出したが,その参照が結果的にインタフェース又はabstract
クラスを参照しているためにインスタンスを生成できない。
InstantiationError
: A symbolic reference has been encountered that is used in class instance creation expression, but an instance cannot be created because the reference turns out to refer to an interface or to an abstract
class. abstract
ではなかったクラスを,そのクラスを参照する他のクラスをコンパイルした後で,abstract
に変更した場合に発生する(13.4.1)。
abstract
is changed to be abstract
after another class that refers to the class in question has been compiled (§13.4.1).
NoSuchFieldError
:
特定のクラス又はインタフェースの特定のフィールドを参照する記号参照を検出したが,そのクラス又はインタフェースは,その名前のフィールドを含んでいない。
NoSuchFieldError
: A symbolic reference has been encountered that refers to a specific field of a specific class or interface, but the class or interface does not contain a field of that name.
NoSuchMethodError
:
特定のクラス又はインタフェースの特定のメソッドを参照する記号参照を検出したが,そのクラス又はインタフェースは,そのシグネチャのメソッドを含まない。
NoSuchMethodError
: A symbolic reference has been encountered that refers to a specific method of a specific class or interface, but the class or interface does not contain a method of that signature.
さらに,あるクラスでnative
メソッドを宣言しており,その実装が見つからない場合,UnsatisfiedLinkError
(LinkageError
の下位クラス)が投げられてもよい。このエラーは,仮想計算機が使用している解決の戦略の種類に応じて,メソッドを使用したとき又はそれ以前に発生する(12.3)。
UnsatisfiedLinkError
(a subclass of LinkageError
) may be thrown if a class declares a native
method for which no implementation can be found. The error will occur if the method is used, or earlier, depending on what kind of resolution strategy is being used by the virtual machine (§12.3).static
フィールド(クラス変数)の初期化子の実行で構成される。インタフェースの初期化は,そのインタフェースで宣言されているフィールド(定数)の初期化子の実行で構成される。
static
fields (class variables) declared in the class. Initialization of an interface consists of executing the initializers for fields (constants) declared there.クラスを初期化する前に,その上位クラスを初期化しなければならないが,そのクラスが実装するインタフェースは初期化しない。同様に,インタフェースを初期化する前に,そのインタフェースの上位インタフェースは初期化しない。
クラスを初期化する前に,その直接的上位クラスを初期化しなければならないが,そのクラスが実装するインタフェースを初期化する必要はない。同様に,インタフェースを初期化する前に,そのインタフェースの上位インタフェースを初期化する必要はない。
クラス又はインタフェースの型 T は,次のいずれか一つが最初に起こる直前に初期化される。
Class
及びパッケージ java.lang.reflect
における自己反映的なメソッドの中にも,呼び出されるとクラス又はインタフェースの初期化を引き起こすものがある。クラス又はインタフェースは,これら以外のいかなる状況においても初期化されない。
Class
and in package java.lang.reflect
also causes class or interface initialization. A class or interface will not be initialized under any other circumstance.ここでの意図は,クラス又はインタフェースの型にはそれを一貫した状態にする初期化子の集合があって,その状態が他のクラスによって観察される初期状態になる,ということにある。静的初期化子及びクラス変数初期化子は,テキスト(ソースコード)で記述された順番に実行され,それらは,テキスト順で使用する後に宣言が現れるクラスの中で宣言されているクラス変数を,たとえそのクラス変数が有効範囲内にあったとしても,参照してはならない(8.3.2.3)。この制限は,ほとんどの循環した初期化又はその他の不正な形式の初期化を,コンパイル時に検出するために設計されている。
8.3.2.3の例に示すとおり,初期化コードを制限していないことによって,その初期化式を評価する前のまだデフォルト値をもっているときに,クラス変数の値を調べることが可能な例を作成できる。しかし,これらの例は,実際にはほとんどない。同様の例は,インスタンス変数の初期化についても作成できる。12.5の最後の例を参照すること。これら初期化では,Java言語のあらゆる能力が使用できる。プログラマは注意して使用しなければならない。この能力によってコード生成には余分な負荷がかかるが,この負荷は,Java言語が並行的であるためにいずれにしても発生する(12.4.3)。
クラスを初期化する前に,その上位クラスを初期化していない場合は,その上位クラスを初期化する。
これは次を出力する。class Super { static { System.out.print("Super "); } } class One { static { System.out.print("One "); } } class Two extends Super { static { System.out.print("Two "); } } class Test { public static void main(String[] args) { One o = null; Two t = new Two(); System.out.println((Object)o == (Object)t); } }
クラスSuper Two false
One
は初期化されない。これは,能動的に使用されておらず,したがってリンクされないことによる。クラスTwo
は,その上位クラスSuper
が初期化された後にだけ初期化される。
One
is never initialized, because it not used actively and therefore is never linked to. The class Two
is initialized only after its superclass Super
has been initialized.クラスフィールドへの参照は,そのフィールドが,下位クラスの名前,下位インタフェースの名前,又はインタフェースを実装するクラスの名前を介して参照される場合であっても,そのフィールドを実際に宣言するクラス又はインタフェースだけの初期化を引き起こす。
これは次だけを印字する。class Super { static int taxi = 1729; } class Sub extends Super { static { System.out.print("Sub "); } } class Test { public static void main(String[] args) { System.out.println(Sub.taxi); } }
これは,クラス1729
Sub
を初期化しないことによる。Sub.taxi
への参照は,クラスSuper
で実際に宣言しているフィールドへの参照であって,クラスSub
の初期化を引き起こさない。
Sub
is never initialized; the reference to Sub.taxi
is a reference to a field actually declared in class Super
and does not trigger initialization of the class Sub
.インタフェースの初期化は,それ自体では,その上位インタフェースの初期化を引き起こさない。
これは次の出力を生成する。interface I { int i = 1, ii = Test.out("ii", 2); } interface J extends I { int j = Test.out("j", 3), jj = Test.out("jj", 4); } interface K extends J { int k = Test.out("k", 5); } class Test { public static void main(String[] args) { System.out.println(J.i); System.out.println(K.j); } static int out(String s, int i) { System.out.println(s + "=" + i); return i; } }
1 j=3 jj=4 3
J.i
への参照は,コンパイル時の定数であるフィールドへの参照となる。したがって,それはI
の初期化を引き起こさない。K.j
への参照は,コンパイル時の定数ではない,インタフェースJ
において実際に宣言されているフィールドへの参照となる。これは,インタフェースJ
のフィールドの初期化を引き起こすが,上位インタフェースI
のフィールド及びインタフェースK
のフィールドの初期化は引き起こさない。インタフェースJ
のフィールドj
を参照するために,K
という名前を使用しているにもかかわらず,インタフェースK
は初期化されない。
J.i
is to a field that is a compile-time constant; therefore, it does not cause I
to be initialized. The reference to K.j
is a reference to a field actually declared in interface J
that is not a compile-time constant; this causes initialization of the fields of interface J
, but not those of its superinterface I
, nor those of interface K
. Despite the fact that the name K
is used to refer to field j
of interface J
, interface K
is not initialized.Class
は,既に検証済み及び準備済みであること,並びにそのオブジェクトClass
は,次の四つの状況の一つを示す状態を含むことを仮定する。
Class
object has already been verified and prepared, and that the Class
object contains state that indicates one of four situations:
Class
は,検証され準備されているが,初期化されてはいない。
Class
object is verified and prepared but not initialized.Class
は,ある特定スレッド T によって初期化実行中とする。
Class
object is being initialized by some particular thread T.Class
は,完全に初期化されており,使用の準備ができている。
Class
object is fully initialized and ready for use.Class
は,エラー状態にある。これは,恐らく,検証段階又は準備段階で失敗しているか,初期化の実行を試みて失敗したことによる。
Class
object is in an erroneous state, perhaps because the verification or preparation step failed, or because initialization was attempted and failed.
Class
を同期(14.18)する。これは,現在のスレッドが,そのオブジェクトに対するロックを獲得できるまで待つことを含む(17.13)。
Class
object that represents the class or interface to be initialized. This involves waiting until the current thread can obtain the lock for that object (§17.13).Class
上でwait
する(待つ)。現在のスレッドがwait
から目覚めた場合は,この段階を繰り返す。
wait
on this Class
object (which temporarily releases the lock). When the current thread awakens from the wait
, repeat this step.Class
のロックを解除し,正常に終了する。
Class
object and complete normally.Class
のロックを解除し,正常に終了する。
Class
object and complete normally.Class
がエラー状態にある場合,初期化は可能ではない。そのオブジェクトClass
のロックを解除し,NoClassDefFoundError
を投げる。
Class
object is in an erroneous state, then initialization is not possible. Release the lock on the Class
object and throw a NoClassDefFoundError
.Class
の初期化が現在のスレッドで進行中であるという事実を記録し,オブジェクトClass
のロックを解除する。
Class
object is now in progress by the current thread and release the lock on the Class
object.Class
が,インタフェースでなくクラスを表現し,このクラスの上位クラスをまだ初期化していない場合,その上位クラスに対してこの手続き全体を繰り返し実行する。必要な場合は,最初にその上位クラスを検証し準備する。上位クラスの初期化が投げられた例外のために中途完了した場合は,オブジェクトClass
をロックし,それにエラーとラベル付けし,すべての待機しているスレッドに通知し,ロックを解除し,それからその上位クラスの初期化から結果として生じるものと同じ例外を投げる。
Class
object represents a class rather than an interface, and the superclass of this class has not yet been initialized, then recursively perform this entire procedure for the superclass. If necessary, verify and prepare the superclass first. If the initialization of the superclass completes abruptly because of a thrown exception, then lock this Class
object, label it erroneous, notify all waiting threads, release the lock, and complete abruptly, throwing the same exception that resulted from initializing the superclass.final
クラス変数及びインタフェースのフィールドは,最初に初期化するものとする(8.3.2.1, 9.3.1及び13.4.8)。
final
class variables and fields of interfaces whose values are compile-time constants are initialized first (§8.3.2.1, §9.3.1, §13.4.8).Class
をロックし,それを完全に初期化されたとラベル付けし,すべての待機しているスレッドに通知し,ロックを解除し,正常にこの手続きを終了する。
Class
object, label it fully initialized, notify all waiting threads, release the lock, and complete this procedure normally.Error
又はその下位クラスの一つでない場合,クラスExceptionInInitializerError
の新しいインスタンスを,実引数として E を伴って生成し,次の段階では E の代わりにこのオブジェクトを使用する。しかし,OutOfMemoryError
が発生したために,ExceptionInInitializerError
の新しいインスタンスが生成できない場合には,その代わりに,次の段階で E の代わりにオブジェクトOutOfMemoryError
を使用する。
Error
or one of its subclasses, then create a new instance of the class ExceptionInInitializerError
, with E as the argument, and use this object in place of E in the following step. But if a new instance of ExceptionInInitializerError
cannot be created because an OutOfMemoryError
occurs, then instead use an OutOfMemoryError
object in place of E in the following step.Class
をロックし,それにエラーとラベル付けし,すべての待機しているスレッドに通知し,ロックを解除し,理由 E 又は以前の決定したとおりに置き換えた理由を付けて,この手続きを中途完了する。
Class
object, label it erroneous, notify all waiting threads, release the lock, and complete this procedure abruptly with reason E or its replacement as determined in the previous step.
初期の実装の中には,その欠陥のために,ここで示すとおりにExceptionInInitializerError
を引き起こすのではなく,初期化中の例外を無視するものもあった。
ExceptionInInitializerError
as described here.) Class
を完全に初期化し使用の準備ができている場合には,初期化手続きの呼出しはもはや不要となる。そこで,例えば,パッチによってそれを解除したり,コードを再生成したりすることによって,コードから削除してもよい。
Class
object is fully initialized and ready for use, then the invocation of the initialization procedure is no longer necessary and it may be eliminated from the code-for example, by patching it out or otherwise regenerating the code.関係する型のグループに対する初期化の順序が決定できる場合,コンパイル時の解析によって,生成されたコードからはある型が初期化済みかどうかの多くの検査を除去してもよいことがある。ただし,それらの解析は,並行処理のこと,及び初期化コードが非制限という事実を,十分に考慮しなければならない。
新しいクラスインスタンスは,次の状況において暗黙的に生成されてもよい。
String
リテラル(3.10.5)を含むクラス又はインタフェースのロードは,そのリテラルを表現するために新しいオブジェクトString
を生成してもよい。同じString
が以前に既に生成済みの場合,これは発生しないかもしれない(3.10.5)。
String
literal (§3.10.5) may create a new String
object to represent that literal. (This might not occur if the same String
has previously been interned (§3.10.5).)String
を生成することがある。文字列連結演算子は,プリミティブ型の値に対して一時的なラッパーオブジェクトを生成してもよい。
String
object to represent the result. String concatenation operators may also create temporary wrapper objects for a value of a primitive type.
新しいクラスインスタンスが生成される場合はいつでも,隠ぺいされてもよいすべてのインスタンス変数を含む,そのクラス型で宣言されるすべてのインスタンス変数及びそのクラス型のそれぞれの上位クラスで宣言されるすべてのインスタンス変数に対して,十分な大きさのメモリ空間を割り当てられる(8.3)。そのオブジェクトにメモリを割り当てるのに十分な領域がない場合,クラスインスタンスの生成は,OutOfMemoryError
で中途完了する。そうでない場合は,その新しいオブジェクトにおけるすべてのインスタンス変数は,上位クラスで宣言されたものを含み,それらのデフォルト値に初期化される(4.5.5)。
OutOfMemoryError
. Otherwise, all the instance variables in the new object, including those declared in superclasses, are initialized to their default values (§4.5.5). 新しく生成したオブジェクトへの参照を結果として返す前に,新しいオブジェクトを初期化するために,指定したコンストラクタを,次の手続きを使用して処理する。
this
を使用した)同じクラスの他のコンストラクタの明示的なコンストラクタ呼出しで始まる場合,実引数を評価し,ここに示すのと同じ五つの手順を使用してそのコンストラクタを再帰的に処理する。そのコンストラクタ呼出しが中途完了した場合,この手続きは,同じ理由で中途完了する。そうでない場合は,手順5に移って継続する。
this
), then evaluate the arguments and process that constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason; otherwise, continue with step 5.this
を使用した)同じクラスの他のコンストラクタの明示的なコンストラクタ呼出しで始まらない場合。このコンストラクタが,Object
以外のクラスに対するものである場合,このコンストラクタは,(super
を使用した)上位クラスのコンストラクタの明示的又は暗黙的な呼出しで開始する。実引数を評価し,ここに示すのと同じ五つの手順を使用してその上位クラスのコンストラクタ呼出しを再帰的に処理する。そのコンストラクタ呼出しが中途完了した場合,この手続きは,同じ理由で中途完了する。そうでない場合は,手順4に移って継続する。
this
). If this constructor is for a class other than Object
, then this constructor will begin with an explicit or implicit invocation of a superclass constructor (using super
). Evaluate the arguments and process that superclass constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason. Otherwise, continue with step 4.
class Point { int x, y; Point() { x = 1; y = 1; } } class ColoredPoint extends Point { int color = 0xFF00FF; } class Test { public static void main(String[] args) { ColoredPoint cp = new ColoredPoint(); System.out.println(cp.color); } }
ColoredPoint
の新しいインスタンスを生成する。フィールドx
,y
及びcolor
を保持するために,最初に新しいColoredPoint
に対してメモリを割り当てる。これらのすべてのフィールドを,それらのデフォルト値(この場合は,それぞれのフィールドに対して0
)に初期化する。次に,コンストラクタColoredPoint
を実引数なしで最初に呼び出す。ColoredPoint
は,コンストラクタを宣言していないので,次の形式のデフォルトコンストラクタをJavaコンパイラが自動的に提供する。
ColoredPoint
is created. First, space is allocated for the new ColoredPoint
, to hold the fields x
, y
, and color
. All these fields are then initialized to their default values (in this case, 0
for each field). Next, the ColoredPoint
constructor with no arguments is first invoked. Since ColoredPoint
declares no constructors, a default constructor of the form:
ColoredPoint() { super(); }
それから,このコンストラクタは,コンストラクタPoint
を実引数なしで呼び出す。コンストラクタPoint
は,コンストラクタの呼出しで始まらないので,コンパイラが,その上位クラスのコンストラクタの暗黙的な実引数なしの呼出しを提供する。それは,次のとおりに記述したものとする。
Point
constructor with no arguments. The Point
constructor does not begin with an invocation of a constructor, so the compiler provides an implicit invocation of its superclass constructor of no arguments, as though it had been written:
したがって,実引数を取らないPoint() { super(); x = 1; y = 1; }
Object
に対するコンストラクタが呼び出される。
Object
which takes no arguments is invoked.
クラスObject
は,上位クラスをもたないので,再帰はここで終了する。次に,Object
のあらゆるインスタンス初期化子及びインスタンス変数初期化子が呼び出される。さらに,Object
の実引数なしのコンストラクタの本体が実行される。Object
では,これらコンストラタが宣言されていないので,コンパイラがデフォルトのコンストラクタを供給する。この特別な場合では,次のとおりとなる。
Object
has no superclass, so the recursion terminates here. Next, any instance initializers, instance variable initializers of Object
are invoked. Next, the body of the constructor of Object
that takes no arguments is executed. No such constructor is declared in Object
, so the compiler supplies a default one, which in this special case is:
このコンストラクタは,何の効果もともなわず実行され返却する。Object() { }
次に,クラスPoint
のインスタンス変数に対するすべての初期化子が実行される。このとき,x
及びy
の宣言は,いかなる初期化式も提供しないので,この例のこの段階に対しては,いかなる動作も要求しない。それから,コンストラクタPoint
の本体が実行され,x
を1
に,y
を1
に設定する。
Point
are executed. As it happens, the declarations of x
and y
do not provide any initialization expressions, so no action is required for this step of the example. Then the body of the Point
constructor is executed, setting x
to 1
and y
to 1
.
次に,クラスColoredPoint
のインスタンス変数に対する初期化子が実行される。この段階では,値0xFF00FF
をcolor
に代入する。最後に,コンストラクタColoredPoint
の本体の残り(super
の呼出しの後の部分)を実行する。本体の残りには文は無いので,それ以上の動作は要求されず,初期化は完了する。
ColoredPoint
are executed. This step assigns the value 0xFF00FF
to color
. Finally, the rest of the body of the ColoredPoint
constructor is executed (the part after the invocation of super
); there happen to be no statements in the rest of the body, so no further action is required and initialization is complete.C++と異なり,Javaプログラム言語は,新しいクラスインスタンスの生成中のメソッドディスパッチのための変更規則を指定しない。初期化中のオブジェクトの中で下位クラスで上書きされているメソッドを呼び出す場合,その新しいオブジェクトを完全に初期化する前であっても,これらの上書きしている側のメソッドを使用する。したがって,コンパイル及び実行例は,次のとおりとなる。
これは,次の出力を得る。class Super { Super() { printThree(); } void printThree() { System.out.println("three"); } } class Test extends Super { int three = (int)Math.PI; // That is, 3 public static void main(String[] args) { Test t = new Test(); t.printThree(); } void printThree() { System.out.println(three); } }
これは,クラス0
3
Super
に対するコンストラクタにおけるprintThree
の呼出しが,クラスSuper
のprintThree
の定義を呼び出さず,むしろクラスTest
におけるprintThree
の上書き定義を呼び出すことを示している。したがって,このメソッドは,Test
のフィールド初期化子が実行される前に動作する。これが,出力の最初の値が0
となる理由であって,(この時点では,)Test
のフィールドthree
は,デフォルト値に初期化されている。メソッドmain
におけるprintThree
のその後の呼出しは,printThree
の同じ定義を呼び出すが,その時点までには,インスタンス変数three
に対する初期化子が実行されており,そのために値3
が出力される。
printThree
in the constructor for class Super
does not invoke the definition of printThree
in class Super
, but rather invokes the overriding definition of printThree
in class Test
. This method therefore runs before the field initializers of Test
have been executed, which is why the first value output is 0
, the default value to which the field three
of Test
is initialized. The later invocation of printThree
in method main
invokes the same definition of printThree
, but by that point the initializer for instance variable three
has been executed, and so the value 3
is printed.コンストラクタ宣言の詳細については,8.8を参照すること。
Object
は,finalize
と呼ぶprotected
メソッドをもつ。このメソッドは,他のクラスによって上書きできる。あるオブジェクトに対して呼び出すことができるfinalize
の特定の定義を,そのオブジェクトの 終了化子(finalizer) と呼ぶ。オブジェクトに対する記憶域をガーベジコレクタが再利用する前に,Java仮想計算機は,そのオブジェクトの終了化子を呼び出す。
Object
has a protected
method called finalize
; this method can be overridden by other classes. The particular definition of finalize
that can be invoked for an object is called the finalizer of that object. Before the storage for an object is reclaimed by the garbage collector, the Java virtual machine will invoke the finalizer of that object.終了化子は,自動記憶域管理機構によって自動的には解放できない資源を解放するための機会を提供する。そのような状況では,あるオブジェクトが使用したメモリを再利用することは,それが保持していた資源を再利用でき ることを保証するものではない。
Javaプログラム言語は,オブジェクトに対する記憶域を再利用する前に終了化子が動作するという点を除いて,終了化子をどれぐらい早く呼び出すかを規定しない。Javaプログラム言語は,どのスレッドがある特定のオブジェクトに対して終了化子を呼び出すかをも規定しない。しかし,終了化子を呼び出すスレッドが,終了化子を呼び出したときに,利用者に見えるどのような同期ロックも保持していないことは保証する。終了化実行中に捕捉されない例外が投げられた場合,その例外は無視され,そのオブジェクトの終了化が終了する。
クラスObject
で宣言されているメソッドfinalize
は,いかなる動作も実行しない。
finalize
method declared in class Object
takes no action.
クラスObject
がメソッドfinalize
を宣言しているという事実は,任意のクラスに対するメソッドfinalize
が,その上位クラスに対するメソッドfinalize
を常に呼び出すことができるということを意味する。これを行うことは,通常,良い習慣である。コンストラクタと異なり,終了化子は,上位クラスに対する終了化子を自動的に呼び出さない。それらの呼出しは,明示的に記述しなければならない。
Object
declares a finalize
method means that the finalize
method for any class can always invoke the finalize
method for its superclass, which is usually good practice. (Unlike constructors, finalizers do not automatically invoke the finalizer for the superclass; such an invocation must be coded explicitly.)
実行効率のために,処理系は,クラスObject
のメソッドfinalize
を上書きしないクラスを覚えておいてもよいが,次に示すとおりの自明な方法でそれを上書きしてもよい。
finalize
method of class Object
, or override it in a trivial way, such as:
処理系は,12.6.1で示すとおりに,上書きされない終了化子をもつオブジェクトを扱い,より効率的にそれらを終了化することを推奨する。protected void finalize() throws Throwable { super.finalize(); }
終了化子は,他のメソッドと同じように明示的に呼び出してもよい。
パッケージjava.lang.ref
は,ガーベジコレクション及び終了化と相互作用する弱参照(weak reference)を記述している。Javaと特別な相互作用をもつAPIを用いる場合,実装者は,java.lang.ref
APIが課す要件を認識しなければならない。この規定は,弱参照について示さない。詳細に関してはAPIの文書を参照すること。
java.lang.ref
describes weak references, which interact with garbage collection and finalization. As with any API that has special interactions with the language, implementors must be cognizant of any requirements imposed by the java.lang.ref
API. This specification does not discuss weak references in any way. Readers are referred to the API documentation for details.
到達可能(reachable) オブジェクトとは,あらゆるライブスレッドからの潜在的に継続する計算でアクセスできるあらゆるオブジェクトとする。プログラムの最適化変換は,到達可能なオブジェクトの数を,単純に到達可能と考えられるオブジェクトの数よりも少ない数に削減するように設計できる。例えば,コンパイラ又はコード生成器は,それらオブジェクトに対する記憶域を潜在的にすぐに再利用可能とするために,もはや使用されない変数又は仮引数を,null
に設定することを選択してもよい。終了化子到達可能(finalizer-reachable) オブジェクトとは,参照のある連鎖を通じて,ある終了化可能オブジェクトからは到達できるが,いかなるライブスレッドからも到達できないものとする。到達不能(unreachable) オブジェクトとは,いづれの方法でも到達できないものとする。
null
to cause the storage for such an object to be potentially reclaimable sooner. A finalizer-reachable object can be reached from some finalizable object through some chain of references, but not from any live thread. An unreachable object cannot be reached by either means.未終了化(unfinalized) オブジェクトとは,終了化子が一度も自動的に呼び出されていないものとする。終了化(finalized) オブジェクトとは,終了化子が自動的に呼び出されたものとする。終了化可能(finalizable) オブジェクトとは,終了化子が一度も自動的に呼び出されていないが,Java仮想計算機が,終了化子を最終的には自動的に呼び出すかもしれないものとする。
オブジェクトのライフサイクルは,次の遷移図に従うものとする。ここで,"終了化子到達可能"は,"f-reachable"と短縮表記している。
オブジェクトを最初に生成したとき(A),それは到達可能及び未終了化とする。
あるオブジェクトへの参照がプログラム実行中に廃棄されるとき,到達可能であったオブジェクトは,終了化子到達可能(B,C又はD)又は到達不能(E又はF)になってよい。終了化子到達可能オブジェクトは,直接的には到達不能にならないことに注意すること。以降に示すとおり,それは,そこから到達可能な終了化子を呼び出すときに到達可能となる。
Java仮想計算機が,未終了化オブジェクトが終了化子到達可能又は到達不能になったことを検出した場合,そのオブジェクトを終了化可能(G又はH)とラベル表示してもよい。さらに,そのオブジェクトが到達不能であった場合,それは終了化子到達可能になる(H)。
Java仮想計算機が,終了化オブジェクトが到達不能になったことを検出した場合,そのオブジェクトは再び到達可能にはならないので,そのオブジェクトが占有している記憶域を再利用してもよい(I)。
任意の時点で,Java仮想計算機は,終了化可能なオブジェクトを取り出し,それに終了化とラベル表示を行い,それからいずれかのスレッドにおけるそのメソッドfinalize
を呼び出してもよい。これによって,そのオブジェクトは終了化及び到達可能(J又はK)になり,さらにそれは,終了化子到達可能であった他のオブジェクトを,再び到達可能にしてもよい(K,M又はN)。
finalize
method in some thread. This causes the object to become finalized and reachable (J, K), and it also may cause other objects that were finalizer-reachable to become reachable again (L, M, N).
終了化可能オブジェクトは,到達不能とはならない。終了化子が最終的に呼び出されるので,到達可能となる。その上で,その終了化子を実行しているスレッドは,そのオブジェクトに対するアクセスを,this
(15.8.3)としてもつ。このように,オブジェクトに対して,八つの可能な状態だけが実際には存在する。
this
(§15.8.3). Thus, there are actually only eight possible states for an object.
オブジェクトを終了した後,自動記憶域管理が到達可能でないと決定するまでは,それ以上の動作は実行されない。オブジェクトが 未終了化(unfinalized) 状態から 終了化可能(finalizable) 状態を経由して 終了化(finalized) 状態に進行する方式なので,そのオブジェクトが終了化した後に再び到達可能になったとしても,それぞれのオブジェクトに対してメソッドfinalize
がJava仮想計算機によって2度以上自動的に呼び出されることはない。
finalize
method is never automatically invoked more than once by a Java virtual machine for each object, even if the object is again made reachable after it has been finalized.終了化子の明示的な呼出しは,オブジェクトの現在の状態を無視し,オブジェクトの状態を未終了化又は終了化可能から終了化に変更することはない。
あるクラスが,クラスObject
のメソッドfinalize
を上書きしない場合(又は前述したとおり,自明な方法だけで上書きする場合)であって,それらのクラスのインスタンスが到達不能になる場合,それらが到達不能になったという(条件の)2番目の決定を待たずに,速やかに廃棄してもよい。この戦略は,遷移図の中に破線の矢印(O)で示している。
finalize
of class Object
(or overrides it in only a trivial way, as described above), then if instances of such a class become unreachable, they may be discarded immediately rather than made to await a second determination that they have become unreachable. This strategy is indicated by the dashed arrow (O) in the transition diagram.
したがって,メソッドfinalize
の設計は簡潔さを保ち,防衛的にプログラムするのがよい。これによって,すべての場合で動作するようになるだろう。
finalize
methods be kept simple and that they be programmed defensively, so that they will work in all cases.例えば,未終了化オブジェクトの循環的にリンクされたグループが到達不能(又は終了化子到達可能)になる場合,すべてのオブジェクトを一緒に終了化可能にしてもよい。最終的には,これらのオブジェクトの終了化子は,任意の順序で呼び出してもよいし,マルチスレッドを使用して並行実行的に呼び出してもよい。自動記憶域管理が,オブジェクトが到達不能であることを後に検出する場合,その記憶域は再利用できる。
すべてのオブジェクトが到達不能になる場合,それらオブジェクトの集合に対して,終了化子的なメソッドの集合を指定した順序で呼び出すクラスを実装することは簡単といえる。
クラスのアンロードは,メモリ使用の削減を助ける最適化とする。プログラムのセマンティクスは,システムがクラスのアンロードなどの最適化を実装するかどうか,及びどのように実装するか,に依存しないほうがよい。依存する場合には,プログラムの移植性を損ねる可能性がある。結果として,クラス又はインタフェースがアンロードされたかどうかは,プログラムに透過的であることが望ましい。
しかし,クラス又はインタフェース C が,それを定義するローダが潜在的に到達可能な間にアンロードされる場合は,C が再ロードされるかもしれない。このことが発生しないと確実にすることはできない。クラスが現在ロードされている他のクラスによって参照されていない場合でさえも、まだロードされていないクラス又はインタフェース D によって参照されるかもしれない。D が C を定義するローダによってロードされる場合は,その実行は,C の再ロードを生じるかもしれない。
例えば,クラスが次をもつ場合には,再ロードは透過的でないかもしれない。
Class
オブジェクトのハッシュ値は,その識別性に依存する。したがって,一般には,クラス又はインタフェースを完全に透過的な方法で再ロードすることは不可能である。
Class
object is dependent on its identity. Therefore it is, in general, impossible to reload a class or interface in a completely transparent manner. ローダが潜在的に到達可能であるクラス又はインタフェースのアンロードは再ロードを引き起こさず,再ロードは透過的ではないが,アンロードは透過的でなければならない,といったことを保証できないので,そのローダが潜在的に到達可能である間は,クラス又はインタフェースをアンロードしてはならないことになる。同様の論理を使用して,ブートストラップローダがロードするクラス及びインタフェースはアンロードできないということを導き出せる。
クラス C を定義するクラスローダを再利用可能な場合,そのクラスをアンロードすることが安全な理由も議論しなければならない。その定義ローダを再利用可能な場合には,そのローダへのライブ参照(ただし,これには,ライブではないが,終了化子によって復活するかもしれない参照が含まれる。)は存在できない。このことは,そのローダが定義する C を含むクラスへの,それらクラスのインスタンス又はコードのいずれかからのライブ参照が存在できない場合にだけ,成立可能となる。
クラスのアンロードは,多くのクラスをロードし,多少時間が経った後にこれらクラスの大部分の使用を中止するアプリケーションに対してだけ重要な最適化になる。こうしたアプリケーションの主要な例はウェブブラウザだが,他にも存在する。これらアプリケーションの特徴は,クラスローダの明示的な使用を通してクラスを管理することにある。結果として,先に示した方針は,これらに対して正しく機能する。
厳密に言えば,クラスのアンロードの問題をこの規定で示すことは重要ではない。これは,クラスのアンロードが単に最適化であることによる。しかし,この問題は非常に微妙な問題なので,明確化のためにここに示した。
Runtime
又はSystem
のexit
メソッドを呼び出し,セキュリティマネジャが,その抜け出し操作を禁止しない。
exit
method of class Runtime
or class System
and the exit operation is not forbidden by the security manager.
目次 | 前 | 次 | 索引 | Java言語規定 第2版 |