interface
コンストラクターがない場合、このコードはどのようにコンパイルされますか?
interface I {
List<Integer> LIST = Arrays.asList(1, 2, 3);
}
誰がList
ここで初期化しますか?
インターフェイスには本当にコンストラクターがありませんか?
はい。それらはインスタンス化できません。
ここで LIST を初期化するのは誰ですか?
インターフェイスの暗黙的な静的イニシャライザ ... は、何かがLIST
オブジェクトを使用できるようになる前に一度呼び出されます1。
インターフェースによって宣言されたフィールドは暗黙的public
にstatic
and final
( JLS 9.3 ) であり、初期化はインターフェースの静的初期化によって実行されます ( JLS 9.3.1 / 12.4.2 )。
1 - 実際には、厳密にはそうではありません。適切に初期化される前に静的フィールドが使用されるプログラムを作成することができます。(詳細は JLS に記載されています。) しかし、それにはいくつかの作業が必要です ... すべきではありません ...
インターフェイスにはコンストラクターがありません。事
interface I {
List<Integer> LIST = Arrays.asList(1, 2, 3);
}
LIST
はインターフェースの変数であり、 を実装するすべてのクラスで使用できるため、コンパイルして機能しますI
。インターフェイスは、同じデータ フィールドとメソッドを持つクラスの共通プロトタイプと考えることができます。つまり、すべての実装者は、変数を除いてそれらを実装する必要があります。
VM
インターフェイスを実装するクラスをロードすると、変数が初期化されます。
インターフェイスで宣言されているすべてのインスタンス メンバーは静的です。したがって、LIST
静的、最終的、および公開です。
したがって、という名前のインターフェイスからメンバーILIST
にアクセスする場合は、次を使用できます。LIST.I
ただし、カプセル化のため、最終的ではないパブリック メンバーは必要ありません。通常、これらの静的最終メンバーは、型の特定のインスタンスに関連付けられます。形状を参照する Type は、Circle または Square の最終的な静的インスタンスを持ちます。
元:
Class shape {
public final shape Circle;
public shape();
void setX() {};
void getX() { return x;}
}
見てください。MIN_VALUEとMAX_VALUEjava.lang.Long
のインスタンスがあります。
オブジェクト指向プログラミングでは、カプセル化を維持するためにgetX()
および関数を使用する必要があります。setX()
Java 定義によるインターフェースは、static、public、およびfinalです。
{ と }のペアの間に実装を指定しないと、インターフェイスをインスタンス化できません。
new InterfaceA() { int getA() { blah...;return x} };