0

重複の可能性:
インターフェース vs 基本クラス
インターフェース vs 抽象クラス (一般的な OO)
抽象クラス vs Java のインターフェース

だから私はプログラミングコースでインターフェイスと抽象クラスについて学んでいます。2 つのトピックは非常に似ているようです。どちらも継承に関係していることは理解していますが、両者の違いは何ですか?

4

4 に答える 4

1

抽象クラスには、メソッド本体にコードが含まれている場合がありますが、これはインターフェイスでは許可されていません。

于 2012-11-08T22:10:28.217 に答える
0

2つの主な違いがあります。

  1. インターフェイスに実装を含めることはできません。インターフェイスは単なる抽象メソッドのリストであり、そのインターフェイスを実装するすべてのクラスは、これらのメソッドをすべて実装する必要があります。一方、抽象クラスには、サブクラスで使用できるいくつかのメソッドの実装を含めることができます。
  2. クラスは、抽象またはその他のスーパークラスを1つだけ持つことができますが、クラスは任意の数のインターフェースを実装できます。
于 2012-11-08T22:24:54.047 に答える
0

抽象クラスにはメソッドを含めることができますが、インターフェースにはメソッドを含めることはできません。

私は通常それを次のように考えます:

  • クラスで他のクラスにメソッドの記述を強制する場合は、インターフェイスを使用します。
  • クラスに複数のクラスの共通メソッドを保持させる場合は、抽象クラスを使用します。

Animalしたがって、たとえば、クラスを作成したい場合があります。そして、DogクラスCatがあります。犬も猫も寝ます。したがって、両方にスリープ方式を設定する必要があります。そして、彼らは本質的に同じように眠ります。したがって、Animalクラスにメソッドを保持させる必要があります(とは同じであるためDogCat

public abstract class Animal {
    public void sleep() {
        //make ZZZZ appear in the air or whatever
    }
}

public class Dog extends Animal {
    //This class automatically has the sleep method
}

public class Cat extends Animal {
    //This class automatically has the sleep method
}

一方、クラスがあったSnakeとしましょう。Sharkヘビとサメの両方が攻撃しますが、方法は異なります(毒と噛みつき)。だからあなたはAttackerインターフェースを持っているかもしれません。

public interface Attacker {
    //We HAVE to have this here
    public void attack(); //Note - we didn't write the method here, just declared
}

public Snake implements Attacker {
    //We HAVE to have this here
    public void attack() {
        //inject venom
    }
}

public Shark implements Attacker {
    public void attack() {
        //rip apart
    }
}

抽象クラスには、未定義のメソッド(インターフェースなど)を含めることもできることに注意してください。だから、あなたは唸り声とヒスpublic void makeMeanSound();Animal持っていることができます。主な違いは、抽象クラスが実際のメソッドを記述できることです。DogCat

インターフェイス-強制的にメソッドを記述します(つまり、強制SnakeSharkてメソッドを使用しますattack())。

抽象クラス-サブクラスに共通のメソッドを提供します。

于 2012-11-08T22:18:41.177 に答える
0

インターフェースには、それを実装するクラスによって定義されなければならないメソッドがあります。

抽象クラスも同様です。ただし、抽象クラスでは、継承クラスが自動的に呼び出すことができるメソッド定義を含めることができます。

結論: すべての実装クラスがメソッドに対して完全に異なる定義を持っている場合は、インターフェースを使用してください。継承クラスが一部の定義を共有し、一部のメソッドに対して異なる定義を持つ場合は、抽象クラスを使用します。

例:

public interface Shape {
    public float getArea();
    public void doThings();
}

public class Circle implements Shape{
    public float getArea() {
        return Math.PI * R * R;
    }

    public void doThings() { }
}

public abstract class Quadilateral implements Shape {

    public float getArea() { // defined
    return l * h;
    }

    public abstract void doThings(); // left abstract for inheriting classes
}

public class Rectangle extends Quadilateral {
    public void doThings() {
    // does things
    }
}

public class Parallelogram extends Quadilateral {
    public void doThings() {
    // does things
    }
}
于 2012-11-08T22:14:26.630 に答える