内部及び無名クラスに一意名を与える
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/26 23:58 UTC 版)
「名前修飾」の記事における「内部及び無名クラスに一意名を与える」の解説
無名の (anonymous) クラスのスコープは、その親クラスに制限される。そのため、コンパイラは「修飾付きの」 (qualified) パブリックな名前を内部クラスに対して与えなければならない。同様に無名のクラスには「偽の」パブリックな名前を生成しなければならない(無名クラスはコンパイラの概念であり、実行時には関係がない)。そこで、次のJavaプログラムをコンパイルすると public class Foo { class bar { public int x; } public void zark () { Object f = new Object () { public String toString() { return "hello"; } }; }} 三つの .class ファイルが生成される。 Foo.class, 主クラス(外側のクラス) Foo を含む。 Foo$bar.class, Foo.bar という名前付きの内部クラスを含む。 Foo$1.class, メソッド Foo.zark に対して局所的な無名の内部クラスを含む。 ドル記号 ($) はJVMの仕様上許されているので、これら三つのクラス名は全て有効であり、Java言語の仕様上 $ は通常のJavaクラス定義に用いることができないので、コンパイラは安全にこれらの名前を利用することができる。 完全修飾名は特定のクラスローダインスタンスの内部でのみ一意であるので、実行時にはJavaにおける名前の解決は更に複雑である。クラスローダは階層性をもっており、JVMの各スレッドはいわゆる文脈クラスローダ (context class loader) を持っている。そこで、二つの異なったクラスローダインスタンスが同じ名前のクラスを含む時、システムは初めルート(あるいはシステム)クラスローダを用いてクラスをロードしようとし、次いで階層に従って文脈クラスローダをたどる。
※この「内部及び無名クラスに一意名を与える」の解説は、「名前修飾」の解説の一部です。
「内部及び無名クラスに一意名を与える」を含む「名前修飾」の記事については、「名前修飾」の概要を参照ください。
- 内部及び無名クラスに一意名を与えるのページへのリンク