2

interfaceコンストラクターがない場合、このコードはどのようにコンパイルされますか?

    interface I {
        List<Integer> LIST = Arrays.asList(1, 2, 3);
    }

誰がListここで初期化しますか?

4

4 に答える 4

6

インターフェイスには本当にコンストラクターがありませんか?

はい。それらはインスタンス化できません。

ここで LIST を初期化するのは誰ですか?

インターフェイスの暗黙的な静的イニシャライザ ... は、何かがLISTオブジェクトを使用できるようになる前に一度呼び出されます1

インターフェースによって宣言されたフィールドは暗黙的publicstaticand final( JLS 9.3 ) であり、初期化はインターフェースの静的初期化によって実行されます ( JLS 9.3.1 / 12.4.2 )。


1 - 実際には、厳密にはそうではありません。適切に初期化される前に静的フィールドが使用されるプログラムを作成することができます。(詳細は JLS に記載されています。) しかし、それにはいくつかの作業が必要です ... すべきではありません ...

于 2012-12-16T06:31:31.577 に答える
1

インターフェイスにはコンストラクターがありません。事

interface I {
    List<Integer> LIST = Arrays.asList(1, 2, 3);
}

LISTはインターフェースの変数であり、 を実装するすべてのクラスで使用できるため、コンパイルして機能しますI。インターフェイスは、同じデータ フィールドとメソッドを持つクラスの共通プロトタイプと考えることができます。つまり、すべての実装者は、変数を除いてそれらを実装する必要があります。

VMインターフェイスを実装するクラスをロードすると、変数が初期化されます。

于 2012-12-16T06:33:50.080 に答える
0

インターフェイスで宣言されているすべてのインスタンス メンバーは静的です。したがって、LIST静的、最終的、および公開です。

したがって、という名前のインターフェイスからメンバーILISTにアクセスする場合は、次を使用できます。LIST.I

ただし、カプセル化のため、最終的ではないパブリック メンバーは必要ありません。通常、これらの静的最終メンバーは、型の特定のインスタンスに関連付けられます。形状を参照する Type は、Circle または Square の最終的な静的インスタンスを持ちます。

元:

Class shape {  
  public final shape Circle;  
  public shape();  
  void setX() {};  
  void getX() { return x;}  
}

見てください。MIN_VALUEMAX_VALUEjava.lang.Longのインスタンスがあります。

オブジェクト指向プログラミングでは、カプセル化を維持するためにgetX()および関数を使用する必要があります。setX()

于 2012-12-16T06:34:08.160 に答える
-1

Java 定義によるインターフェースは、staticpublic、およびfinalです。

{ と }のペアの間に実装を指定しないと、インターフェイスをインスタンス化できません。

new InterfaceA() { int getA() { blah...;return x} };
于 2012-12-16T06:36:27.133 に答える