3

たとえば、4 つのメソッドを持つインターフェイスがあります。

この不完全なインターフェースをクラスに実装する場合、そのクラスは抽象でなければなりません。右?

たとえば、1 つのメソッドを除外します。だから今、このクラスを拡張するサブクラスを書いています。次に、インターフェイスの最後のメソッドを実装します。

このメソッドを抽象スーパークラスで呼び出すとどうなりますか? 何もない!できます。しかし、なぜ?

複数のクラスを作成し、この抽象クラスを拡張してインターフェイスの 4 番目のメソッドを実装するとどうなりますか? どっちが呼ばれる?

4

4 に答える 4

1

インターフェースは、メソッドの署名を定義するコントラクトであり、動作と定数のみであり、すべてのメソッドはパブリックで抽象的です。

Abstract Class動作と状態を定義すると、いくつかの実装メソッドと抽象メソッドを持つことができます。

あなたの質問の例:

この不完全なインターフェースをクラスに実装する場合、そのクラスは抽象でなければなりません。右?

たとえば、1 つのメソッドを除外します。だから今、このクラスを拡張するサブクラスを書いています。次に、インターフェイスの最後のメソッドを実装します。

このメソッドを抽象スーパークラスで呼び出すとどうなりますか? 何もない!できます。しかし、なぜ?

ランタイム実行で原因を実行します。クラスが何であるかを知っています。これがポリモーフィズムです。

この抽象クラスを拡張し、インターフェースの 4 番目のメソッドを実装して、いくつかのクラスを作成するとどうなるでしょうか。どっちが呼ばれる?

クライアントコードでインスタンス化するもの:D

public interface Operation{ 
 void operation1();
 void operation2();

}

operation2 は実装していません

public abstract class ClaseBase implements Operation{
//with final im saying childs wont override
 public final void operation1{
   // do something
   operation2();
   // do something
 }


}

// operation2 は具象クラスであるため、実装する必要があります

public class Child extends ClaseBase{
 void operation2(){
   System.out.println("Something");
 }

}

AbstractClass をインスタンス化することはできません。

クライアントコードで

ClaseBase base = new Child();
base.operation1(); // and it's gonna to call operation2 in childClass 

抽象クラスはTemplate Methodパターンで役立ちます。

于 2013-06-18T20:22:15.420 に答える
0

サブクラスをインスタンス化し、それをスーパー/抽象クラスまたはインターフェースとして参照する場合、それは依然としてサブクラスのインスタンスであることに注意してください。サブクラスで使用できない場合、オブジェクトで呼び出されたメソッドはサブクラスからスーパークラスにバブルアップします。

したがって、次の場合:

  interface GemeInterface
        getStartScreen()
        getCloseScreen()

  abstract class AndroidGame implement GemeInterface
        getCloseScreen()

  class MrNomGame extends AndroidGame
        getStartScreen()

  class MrPetNomGame  extends AndroidGame
        getStartScreen()

として使用する

//You can't instantiate AndroidGame hence the it has to be instance of a subclass
AndroidGame androidGame1 = new MrNomGame ();
androidGame1.getStartScreen(); 

//You can't instantiate AndroidGame hence the it has to be instance of a subclass
AndroidGame androidGame2 = new MrPetNomGame ();
androidGame2.getStartScreen();

次に、androidGame1.getStartScreen() --> MrNomGame からメソッドを呼び出し、 androidGame2.getStartScreen() --> MrPetNomGame からメソッドを呼び出します。

ieandroidGame1.getCloseScreen()との両方の呼び出しは、サブクラスでは使用できないためandroidGame2.getCloseScreen()、メソッドを呼び出すことになります。AndroidGame

于 2013-06-18T20:15:21.653 に答える
0

作成したオブジェクトによって異なります。スーパー クラスは、サブクラス オブジェクトを参照できます。したがって、実際のオブジェクトのメソッドが呼び出されます。

interface A{

public void test1();

public void test2();

}

public abstract class B implements A{

public void test1(){

}

public abstract public void test2();

}

public class C extends B{

public void test2(){

}
}

B b = new C();
b.test2();//This works because the object that is refered by B is actually an object of C

実際、次のこともできます。

A a = new C();
a.test1();
a.test2();

繰り返しますが、A はインターフェイス (スーパー タイプ) ですが、実際には具体的な実装 C (サブタイプ) オブジェクトを参照しているため、これは機能します。

したがって、コンパイル時に、コンパイラは A/B に test2() というメソッドがあるかどうかをチェックします。ある場合、コンパイルは成功し、正常にコンパイルされます。しかし、実行時に、オブジェクトに対して test2() メソッドを呼び出すと、オブジェクトは実際には完全な実装を持つクラス C になります。

于 2013-06-18T20:16:21.537 に答える
0

このメソッドを抽象スーパークラスで呼び出すとどうなりますか? 何もない!できます。しかし、なぜ?

このメソッドはabstractインスタンス化できないため、スーパークラスで呼び出すことはできません。この抽象スーパークラスのサブクラスでのみ、実装を提供する必要がある (またはそれ自体を抽象宣言する) 必要があります。

したがって、このメソッドを呼び出すと、非抽象サブクラスによって提供される実装が実行されます。

面白いことに、「AndroidGame」クラスのメソッドが「getStartScreen()」を呼び出します。しかし、「AndroidGame」を拡張する「MrNomGame」のようないくつかのクラスが存在する可能性があります。では、どのメソッドが実行されるのでしょうか?

実行されるメソッド コードは、このメソッドを呼び出す実際のオブジェクトのランタイムタイプによって異なります。だから、あなたはこのようなコードを持つことができます

AndroidGame game1 = new MrNomGame();
AndroidGame game2 = new SomeOtherGame();

game1.getStartScreen(); // invokes MrNomGame's version
game2.getStartScreen(); // invokes SomeOtherGame's version

動的バインディングにより、JVM はgetStartScreen()、参照が指す実際のオブジェクトのクラス タイプによって実装された を呼び出します。

于 2013-06-18T20:40:05.227 に答える