目次 | 前項目 | 次項目 内部クラス仕様


ネストされたクラスを finalprivateprotected、または static と宣言することができるか?

既存アクセスの保護と修正モードはすべて、他のクラスのメンバである型に通常どおりに適用されます。クラスとインタフェースはその親クラス内で private または protected と宣言することができます。

ブロックに対してローカルであるクラスはメンバではなく、そのため publicprivateprotected または static にはなれません。これはスコープ外で使用できないため、事実上ブロックに対して private です。

アクセス保護は、1 つのクラスが他を囲むか、または第 3 のクラスにそれらが囲まれる限り、クラスが他のクラスのメンバを使用することを防ぐことはできません。

すべてのクラス(それが名前を持つ場合)を final または abstract と宣言でき、すべてのアクセス可能な非 final の名前を持つクラスまたはインタフェースは、スーパータイプとして機能できます。コンパイラはまた、クラスがサブクラスを持たず、サブクラスを後で追加する方法もないと判別できる場合、クラスを final に変更する可能性があります。これは、private またはブロックローカルクラスがスコープ内にサブクラスを持たないときに可能です。

static とマークできるメンバ

static 宣言修飾子はプログラマに、特定のインスタンスよりは全体としてクラスに適した、クラスメソッドおよびクラス変数を定義する方法を与えるために設計されました。 これらは「トップレベル」エンティティです。

static キーワードもまた、トップレベルクラス T の本体内のクラス C の宣言を修正する可能性があります。この効果は C もまたトップレベルクラスであると宣言することです。T のクラスメソッドが本体に T のカレントインスタンスを持たないように、C もまた T のカレントインスタンスを持ちません。こうして、static のこの新しい使用法は任意ではありません。

トップレベルクラス(ネストしているかどうかに関わらず)とは反対に、内部クラスは static メンバをなに 1 つ宣言できません。内部クラスに対してクラス変数を作成するためには、プログラマは希望する変数を親クラスに配置する必要があります。

static キーワードは常に、親インスタンスに決して従属しない「トップ レベル」構築物(変数、メソッド、またはクラス)をマークするというように使用すると、この時点では役に立ちます。

これはなぜ内部クラスが static メンバを宣言できないかを示します。それは、内部クラスの本体全体が、 1 つ以上の親インスタンスのスコープにあるからです。

C 言語はブロックローカル static 変数を許容しますが、同じ効果は Java においても、希望する長寿の変数を必要な寿命に対応したスコープ内に定義して、もっと普通にそして保守性のいい形でその効果を得ることができます。


目次 | 前項目 | 次項目

内部クラス仕様 (HTML generated by dkramer on March 15, 1997)
Copyright (c) 1996, 1997 Sun Microsystems, Inc. All rights reserved
コメントや訂正は john.rose@eng.sun.com 宛てに送ってください。