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


Java 言語仕様は内部クラスに対してどのように変わったか?

顕著な変更はわずかしかありません。それは、新しい機能が主に既存の言語の制限を緩和し、古い設計に対して新しい機能開発に取り組んだからです。主要な変更は、型が現在型をメンバとして持てるということです。(しかし、型名はインスタンス式を含むことができません。)スコープ、名前スコーピング、メンバ名前付け、メンバアクセス制御の基本的な定義は代わっていません。

クラス本体およびブロック構文には次の拡張が行われました:

        ClassMemberDeclaration, InterfaceMemberDeclaration:
                 ...
                 ClassDeclaration
                 InterfaceDeclaration


        BlockStatement:
                 ...
                 ClassDeclaration


型メンバである型はサブ型によって継承され、同じ名前の型宣言によってその中に覆い隠されます。(型は決して「仮想」ではありません。) 型であるメンバは private または protected と宣言される可能性があります。

static メンバクラスまたはブロックや式によって定義されたクラスは、内部クラスです。他のすべてのクラスはトップレベルです。内部クラスは static メンバ、static 初期化子またはメンバインタフェースを宣言しません。パッケージメンバは決して static にはなりません。しかし、トップレベルクラスのメンバであるクラスは static と宣言されるかもしれず、そのためこれもまたトップレベルであると宣言します。インタフェースは非メソッドメンバであると同様に、常に static です。

クラスは親クラスと同じような簡単な名前を持たない可能性があります。

キーワード this は可能ないくつかのカレントインスタンスを選択するために、修飾することができます。(内部クラスは 2 つ以上のカレントインスタンスを持ちます。)

        PrimaryNoNewArray:
                 ...
                 ClassName
. this

クラスインスタンス作成の構文は、匿名クラスおよび囲うインスタンスをサポートするために、次のように拡張されました:

        ClassInstanceCreationExpression:
        
        new TypeName ( ArgumentListopt ) ClassBodyopt
        
        Primary . new Identifier ( ArgumentListopt ) ClassBodyopt

new 式は、本体を指定して匿名クラスを定義します。独立して、new 式の型は、即座の親クラスがキーワード new の前の修飾式として与えられた場合、内部クラスの簡単な名前として指定されます。修飾インスタンスは新しいオブジェクトの囲うインスタンスになります。super の対応する修飾によって、サブクラス構築子は、内部クラスであるスーパークラスの囲うインスタンスを指定できるようになります:

        ExplicitConstructorInvocation: ...
        
         Primary . super ( ArgumentListOpt ) ;

内部クラスが修飾されていない new または super 式で構築される場合、囲うインスタンスは必要な型の(最奥の)カレントインスタンスです。

1.0 Java 言語仕様における名前バインディングの詳細記述では、辞書スコーピングの新しい規則を反映するために一部改訂が必要となります。例えば、簡単な変数名は、定義がクラスまたはブロックから来たものかどうかに関わらず、最奥の辞書的に明白な定義を参照します。簡単な型名についても同じことが言えます。修飾子名の文法(すなわち、AmbiguousName)は他の型名を修飾するクラス名の可能性を反映するために拡張されます。修飾された型名内の当初の簡単な名前は、その名前のクラスがスコープにある場合、クラス名になります; そうでなければ、Java 1.0 のようにパッケージ名になります。

サブクラス C のすべての継承されたメンバ m は、C 内のすべての内部クラスを含め C の本体内のスコープにあります。C 自身が内部クラスの場合、親スコープ内に m に対する同じ種類の定義(変数、メソッドまたは型)がある可能性があります。(スコープはブロック、クラスまたはパッケージです。) このようなケースすべてにおいて、継承されたメンバ mm の他の定義を覆い隠します。さらに、覆い隠された定義がパッケージメンバでない場合、簡単な名前 m は不当です; プログラマは C.this.m を書く必要があります。

すべての種類(トップレベルまたは内部)のネストしたクラスは、 import 文のどちらかの種類によってインポートすることができます。import 文のクラス名は完全パッケージ修飾され、継承関係の参照なしに解決できる必要があります。Java 1.0 でのように、同じ名前のクラスとパッケージが共存することは不当です。

break または continue 文は、即座の親メソッドまたは初期化子ブロック内のラベルを参照する必要があります。非ローカルなジャンプはありません。

明確な代入の確認は、ブロックと式によって定義されたクラスを含み、これらクラス内の変数の発生に拡張します。内部クラスで使用され定義されていない局所変数はすべて、final と宣言し、内部クラスの本体の前に明確に代入する必要があります。


目次 | 前項目 | 次項目

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