2017-12-18 3 views
-3

Interfaceにコンストラクタがないので、javaのインタフェースの変数を初期化するのは誰ですか?javaのインタフェースの変数を初期化するのは誰ですか?

+7

interface Test { C c = new C(); } 

は次のようになり、コンパイル時に静的ブロックにつながる:インタフェースの参照を持っている

class C { } 

:たとえば、クラスを持ちますインターフェイスのインスタンスを作成することはできません。そのインタフェースの実装者のインスタンスを作成することしかできません*具体的なクラス*。さらに、インターフェースは定義によってメンバーを持つことができません。 – Michael

+0

@Michael:あなたは "メンバー"の珍しい意味を使用しているようです。メソッドや定数フィールドはメンバであるため、インタフェースはメンバを持つことができます。ネストされた型もメンバーです。 – Holger

+0

@Holger私の悪い。私は「畑」を意味しました。 – Michael

答えて

3

Javaは、interfacesの暗黙的修飾子を使用します。だから、インターフェース:

public interface I { 
    String FIELD = "Some field"; 

    void method(); 
} 

は、実際には以下のように書くことができる

public interface I { 
    public static final String FIELD = "Some field"; 

    public abstract void method(); 
} 

は、その後、あなたは、インターフェイスのフィールドすべてがpublic static finalとメソッドpublic abstractあることがわかります。

フィールドがstatic finalおよびstatic-initializer-blocksであるため、インターフェイスでは許可されていないため、直接初期化する必要があり、コンストラクタは使用されません。

2

これはところで、あまりにも、クラス内のpublic static final変数よりも違いはありません - それ一定値javap出力として - まあ、それはconstantなので、それは、コンストラクタで初期化されません。

class Test { 
     public static final int x = 5; // ACC_PUBLIC, ACC_STATIC, ACC_FINAL 
            // ConstantValue: int 5 

     public int y = 3; // putfield , initialized inside default constructor 
} 

EDITホルガーは静的ブロック内の初期化コードがあることを彼のコメントに右です。

interface Test { 

    C c; 

    static { 
     c = new C(); 
    } 
} 
関連する問題