javaインターフェースの中にメンバー変数がありますか?

10862 ワード

答えは:いいですが、public static finalでなければならないし、public static finalでなければなりません。
JDK 1.7がサポートインターフェースにdefault方法とstatic方法が存在するようになった以上、これらの方法は実装上、メンバー変数がデータサポートを提供する必要があります。まず例を見ます。
//  JDK1.8
//IA.java
public interface IA {
    int a = 100;
    double NUM = 1;//   public static final double NUM = 1;
    String name = "IA";

    void say();
    default void print() {
        System.out.println("IA:print()");
    }
    default void pritA() {
        System.out.println("IA: " + name);
    }
}

//IB.java
public interface IB {
    int b = 200;
    double NUM = 2;
    String name = "IB";

    void say();
    default void print() {
        System.out.println("IB:print()");
    }
    default void pritB() {
        System.out.println("IB: " + name);
    }
}

//AB.java
public class AB implements IA, IB {
    public static void main(String[] args) {
        AB ab = new AB();
        //ab.name   ,     IA  name  IB  
        System.out.println(a);//100    a b        ,             
        System.out.println(b);//200
        System.out.println(IA.NUM);//1.0
        System.out.println(IB.NUM);//2.0
        System.out.println(IA.name);//IA
        System.out.println(IB.name);//IB
        ab.say();//AB:say()
        ab.print();//AB:print()
        ab.pritA();//IA: IA
        ab.pritB();//IB: IB
    }

    //             ,        ,    IA  say()
    @Override
    public void say() {
        System.out.println("AB:say()");
    }

    //    IA IB   (    ) default  ,    print      IA    ,  IB  。
    @Override
    public void print() {
        System.out.println("AB:print()");
    }
}
これに基づいて結論を出す:
  • インターフェースのメンバー変数はデフォルトで、public static finalしかないので、これらのアクセス修飾子を加えると余計です。
  • インターフェースのメンバー変数は、インプリメンテーションクラスで直接アクセスできます。(静的方法であれ、非静的方法であれ)、親インターフェースに重複して現れるメンバー変数があれば、インターフェース名を付けて区別するしかありません。
  • インターフェースにおけるdefault修飾の方法は、サブクラスにデフォルトの実装を提供する。
  • サブクラスは、複数のインターフェースを実現し、複数のインターフェースで同様に署名する方法がある場合、順序付け規則に従って、前のインターフェースに書くことを基準とする。親インターフェースのdefaultメソッドが重複している場合、サブクラスはこの方法を書き直さなければならない(そうでなければ、複数のインターフェースのそれぞれが実現を提供しているので、サブクラスはどれを呼び出すか分かりません)。