3

インターフェイスのさまざまなメソッドが実装されているインターフェイス内にクラスを作成できますか。ここで、Java がインターフェイス内に内部クラスを記述できる理由と、それをどこで使用できるかについて疑問を持っています。

以下のプログラムでは、インターフェイス内にクラスを記述し、インターフェイスのメソッドを実装しています。インターフェイスの実装クラスで、内部クラス メソッドを呼び出しました。

public interface StrangeInterface
    {
      int a=10;int b=5;
      void add();
      void sub();
      class Inner
       {
         void add()
          {
             int c=a+b;
             System.out.println("After Addition:"+c);
          }
         void sub()
         {
             int c=a-b;
             System.out.println("After Subtraction:"+c);
         }
       }
    }   

 abstract public class StrangeInterfaceImpl implements I { 
      public static void main(String args[])
    {
       StrangInterface.Inner i=new StrangeInterface.Inner();
       i.add();
       i.sub();
    }
 }
4

4 に答える 4

5

インターフェイス内でクラスを定義できます。インターフェイス内では、内部クラスは暗黙的にpublic static.

JLS セクション 9.1.4から:

インターフェイスの本体では、インターフェイスのメンバー、つまり、フィールド (§9.3)、メソッド (§9.4)、クラス(§9.5)、およびインターフェイス (§9.5) を宣言できます。

JLS セクション 9.5から:

インターフェイスには、メンバー型の宣言が含まれる場合があります (§8.5)。

インターフェイスのメンバー型宣言は、暗黙的に static および publicです。これらの修飾子のいずれかまたは両方を重複して指定することは許可されています。

インターフェイスまたは他のクラス内で定義された内部クラスに対する唯一の制限は、それを囲むメンバー名を使用してそれらにアクセスする必要があることです。
それを除けば、それらの間には関係はありません。内部クラスは、コンパイル後に完全に異なるクラス ファイルになります。

たとえば、次のソース ファイルをコンパイルするとします。

interface Hello {
    class HelloInner {

    }
}

2 つのクラス ファイルが生成されます。

Hello.class
Hello$HelloInner.class
于 2013-08-19T18:39:01.583 に答える
2
Can we have a class inside an interface which has different methods of the interface implemented in it.

私見しかし、インターフェースはその目的のためのものではありません。

inner classを aninterfaceに書くと、常にpublic and static.

と同等です

public interface StrangeInterface
    {
 public static class Inner{

}

および内の変数interfaceも明示的にpublic static variables

于 2013-08-19T18:37:48.157 に答える
1

インターフェースは、デフォルトとして独自の実装を提供する場合があります。

implements内部クラスをインターフェイスとして宣言しない限り、それが内部クラスであることを除いて、2 つの間に関係はないことに注意してください。クラスがインターフェイスに非常に密接に関連している場合、これは本質的に不合理ではありませんが、一般的に有用なパターンであるとは思えません。

于 2013-08-19T18:43:22.763 に答える
0

インターフェース内でクラスを定義することにより、「どこで使用できるか」を要約するには:
1.インターフェースのデフォルト実装を提供するため
2.インターフェースメソッドの引数または戻り値の型がクラスである場合

あなたのコードを書く

    interface StrangeInterface {
    int a = 10;
    int b = 5;

    void add();

    void sub();

    class Inner implements StrangeInterface {
        public void add() {
            int c = a + b;
            System.out.println("After Addition:" + c);
        }

        public void sub() {
            int c = a - b;
            System.out.println("After Subtraction:" + c);
        }
    }
}

class MyTest implements StrangeInterface {

    public void add() {

        System.out.println("My own implementation for add : " + (a +b));
    }

    public void sub() {
        System.out.println("My own implementation for sub : " + (a- b));

    }

}

public class StrangeInterfaceImpl {

    public static void main(String args[]) {
        StrangeInterface.Inner i = new StrangeInterface.Inner(); // calling default implementation
        i.add();
        i.sub();

        MyTest t = new MyTest();   // my own implementation
        t.add();
        t.sub();
    }
}
于 2018-07-18T19:19:45.433 に答える