-3

IメソッドとのインターフェースがあるとしますdoIt();

今、私は実装するクラスCを持っているIので、実装を提供しますdoIt();

クラスの次のコードの場合Hello

public class Hello{
    I i = new I();
    i.doIt();
}

1.) doIt() の実装はどこから取得しますか?

2.)関数の実装が異なる別のクラスがHelloWorld実装されている場合はどうなりますか。では、どの実装が必要でしたか?IdoIt()

4

7 に答える 7

4

このようなものをコンパイルしてみてください。Classインスタンス化できるのは、を実装するだけInterfaceで、Interface直接インスタンス化することはできません。

Anは、契約時に同意するInterface契約のようなものです。の合意の範囲内で、それの実装を提供します。ClassimplementsInterfaceClass

于 2012-08-02T05:39:34.307 に答える
2

インターフェイスをインスタンス化できません。投稿したコードはコンパイルしないでください。あなたができることはそのようなものです:I c = new C();。これにより、の適切な実装がdoIt()呼び出されることも確認されます。

の詳細は、このOracleチュートリアルを参照してくださいInterfaces

于 2012-08-02T05:38:44.837 に答える
2

これは決して機能しません

public class Hello{
    I i = new I(); // I is an interface, can't be instantiated
    i.doIt();
}

私はあなたが欲しいと思います...

public class A implements I {
    public void doIt() {

        System.out.println("A did it");

    }
}
public class B implements I {
    public void doIt() {

        System.out.println("B did it");

    }
}

public class Main {
    public static void main(String args[]) {
        I i = new A();
        i.doIt();
        i = new B();
        i.doIt();
    }
}

これは出力します

A did it
B did it
于 2012-08-02T05:40:53.807 に答える
2

インターフェイスをインスタンス化することはできません。具体的なクラスのみをインスタンス化できます。の実装doIt()は、インスタンス化された具象クラスで定義されたものです。そのクラスが実装を提供しない場合は、スーパークラスから継承されます。

補足として、コード例では、メソッドまたは静的ブロックに含まれていないクラスにコードがあります。これは違法です。メソッドまたは静的ブロックでコードを囲む必要があります。

于 2012-08-02T05:37:08.973 に答える
1

インターフェイスをインスタンス化する唯一の方法は、実装に固有の匿名内部型を追加することです。悪いデザインのように見えますが、便利な場合もあります。乾杯。

    II i = new II() {

        @Override
        public void doit() {
            // TODO Auto-generated method stub

        }
    };
于 2012-08-02T05:46:33.293 に答える
0

実装はなく、コードはコンパイルされません。簡単な実例を作成してみてください。そうすれば理解できます。ところで、構文はとにかく間違っています。私がインターフェイスの場合、インターフェイスを実装する匿名クラスを作成するには、中括弧を開く必要があります。

I i = new I() { public void doIt() {} };
于 2012-08-02T05:39:44.447 に答える
0

コードI i = new I();正しくないためIinterfaceインターフェイスをインスタンス化できません。インスタンス化する必要がある場合は、次のようにする必要があります。

I i = new I(){
   public returntype doIt(){
    ...
   }
};

現在、上記の実装はここでは匿名内部クラスとして知られています

于 2012-08-02T05:40:24.103 に答える