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


Java 1.1 言語における他の変更点

Java 1.1 言語には、4 つの追加の拡張が行われ、言語の小さなホールを埋め、ある種の API を簡単に使用できるようにしました。

インスタンス初期化子

static 初期化子構文は拡張され、次のようにインスタンスの初期化もまたサポートします:

        ClassBodyDeclaration:
                 Block


static キーワードなしに導入された初期化コードは、スーパークラス構築子がインスタンス変数初期化と共にテキスト順に呼び出された直後に、すべての構築子によって実行されます。

インスタンス初期化子は、式を各構築子の throws 節で明示的に宣言して いない場合、確認済例外を返したり、スローしたりしません。 匿名クラスのインスタンス初期化子は、すべての例外をスローすることができます。

インスタンス初期化子は、インスタンス変数(ブランク final を含む)をコードで初期化する必要があるとき有用です。このコードは例外をキャッチするか、または単一の初期化子式で表現できない他の種類の制御フローを実行する必要があります。インスタンス初期化子は、匿名クラスが自分自身を初期化する場合に必要になります。それは、匿名クラスが構築子をなに 1 つ定義できないからです。

匿名配列式

配列割当構文は拡張され、匿名配列の要素の初期化をサポートします。名前の付いた配列が要素式の中括弧で囲まれたリストによって初期化されるように、配列作成式は、現在中括弧で囲まれたリストが後に付きます。両方のケースで、配列型は次元の式を含むことが許されません; 次元は要素式の数を数えて計算されます。次に新しい構文を示します:

        ArrayCreationExpression:
        
        new Type Dims ArrayInitializer

次の2つの文に相当するもので新しい構文を例証します:

            T v[] = {a};
            T v[] = new T[] {a}; 

クラスリテラル

        PrimaryNoNewArray:
                 ...
                 Type
. class
        
        void . class

クラスリテラル はクラス名、インタフェース、配列または`.'とトークン class を後ろに付けたプリミティブ型から構成される式です。これは Class という型のオブジェクト、名前の付いた型(または void 用)のクラスオブジェクトを評価します。

参照型については、クラスリテラルは適当な文字列の付いた Class.forName への呼び出しに相当します。ただし、これは確認済例外を発生させない点を除きます。(この効率性は、メソッド呼び出しよりもフィールドアクセスに匹敵するようです。) 参照型のクラスリテラルは、変数のクラスが使用可能でないときにクラス変数参照がエラーを発生させるのと同じように、NoClassDefFoundError を発生させることができます。

プリミティブ型または void のクラスリテラルは、次の表によれば事前にインストールしたプリミティブ型記述子への static 変数参照に相当します:

        boolean.class   ==   Boolean.TYPE
        char.class      ==   Character.TYPE
        byte.class      ==   Byte.TYPE
        short.class     ==   Short.TYPE
        int.class       ==   Integer.TYPE
        long.class      ==   Long.TYPE
        float.class     ==   Float.TYPE
        double.class    ==   Double.TYPE
        void.class      ==   Void.TYPE

クラスオブジェクトをメソッド引数として必要とする Java API は、クラスリテラル構文が使用可能なときもっと簡単に使用できます。コンパイラはクラスリテラルの TypeName をプロセスするとき、親 package および import 文を考慮する責任があることに注意してください。

Class.forName の古い使用法では、プログラマが希望するパッケージの前置を指摘し、それをクラス名文字列に書くことを要求しています。文字列を正しくスペルすることの難しさが、親クラスの存在で大きくなっています。それは、(Class.forName によってプロセスされるように、)これらの名前がドットの代わりに `$' 文字でエンコードされるからです。

クラスリテラルは決して式を含まず、型名だけであることに注意してください。

ブランク final および final 局所変数

ブランク final は初期化子を欠いた final 変数宣言(すべての種類)です。ブランク final は、一度、初期値に代入する必要があります。

明確な代入規則は拡張され、「明確に代入されていない」変数を記録し、ブランク final への代入は、その final が代入文の前に明確に代入されている場合禁じられます。続いて、これは明確に代入され、final であるために同じ実行パスに沿って再代入することはできません。

明確な非代入規則はループの後方分岐を考慮し、ループ本体の変数発生は、ループが後方分岐を経由してその発生に到達できる代入を行う場合、明確に代入されます。明確な代入確認は、ループの最初の繰り返しが if 文の中に展開されたかの如くに機能します。

ブランク final クラス変数は static 初期化子によって(同じクラスに)明確に代入される必要があります。これは、クラス変数が明確な代入に対して確認される唯一のコンテキストです。

ブランク final インスタンス変数は、非 static 初期化子またはすべての構築子によって、明確に代入される必要があります。これらは、明確な代入確認がインスタンス変数上で行われるという唯一のコンテキストです。これらのコンテキスト内で、this.V への代入が、明確な代入確認のために名前 V への代入を実行するものとして認識されます。

すべての種類のローカル変数とパラメータは、現在 final と宣言することができます:

        LocalVariableDeclaration:
                 Modifiers
Opt Type VariableDeclarators

        FormalParameter:
                 Modifiers
Opt Type VariableDeclaratorId

このような変数は、ローカル変数を支配する通常の明確な代入規則に従います。さらに、これは初期化以外には代入できません。

メソッドパラメータまたは catch formal パラメータは final と宣言されます。これはメソッドシグネチャまたはキャッチされた例外型に影響を与えません。メソッドまたはキャッチの本体内で、パラメータは代入されません。

final 宣言修飾子を使用して、ローカル変数およびパラメータを親クラスが使用できるようにします。


目次 | 前項目 | 次項目

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