0

Javaのインターフェースと抽象クラスの違いについて尋ねることは、非常に基本的で古典的で単純な質問であることを私は知っています。しかし、この質問は少し異なります。

Javaは、菱形継承問題を回避するために複数のクラスからの継承をサポートしていないことを理解しているため、一種の多重継承を容易にする代替方法としてインターフェースの概念を考え出しました。しかし、これがインターフェースが存在する唯一の理由ですか?

何らかの理由で、新しいバージョンの1つにあるJava Guysがこの制限を克服し、複数のクラスからの継承を許可すると仮定した場合、抽象クラスとインターフェースの違いは何でしょうか。それらは単に同義語でしょうか?インターフェイスにはまだ存在する理由がありますか、それとも単に冗長になりますか?

4

4 に答える 4

3

クラスに抽象メソッドが1つでもある場合、そのクラスは「抽象」です。他のメソッドは抽象クラスで実装できます。インターフェイスはそれを行うことができません。それらは純粋に抽象的なものです。

public interface Iface {
    void foo() {
        System.out.println("Foo");
    }
}
$ javac Iface.java
Iface.java:2:インターフェースメソッドは本体を持つことができません
    void foo(){
               ^
1エラー

しかし、すべてのメソッドが抽象である完全に抽象クラスについて話している場合、多重継承を仮定すると、実際に残っている違いはすぐにはわかりません。


上記の質問に対するコメントを再確認してください。

しかし、Javaが複数のクラスからの継承を許可していたことを理解しようとすると、言語仕様のエンティティとしてインターフェースがあったでしょうか。

Javaが1日目から多重継承を持っていたとしたら、抽象クラスがその仕事をしていたので、おそらくそうではなかったでしょう。

于 2012-05-14T08:37:45.303 に答える
2

それらは単に同義語でしょうか?インターフェイスにはまだ存在する理由がありますか、それとも単に冗長になりますか?

(抽象クラ​​スをインターフェースと比較することはよくある質問であるという事実を知っているように思われるので、インターフェースは状態またはデフォルトのメソッド実装を持つことができないことを知っていると思います。)

抽象メソッドしかないクラスはインターフェースとまったく同じなので、そうです、ある意味では、インターフェースは単なる構文糖衣だと思います。

コードでは、

interface Foo {
    void method();
}

class MyClass extends MyBaseClass implements Foo {
    public void method() { ... }
}

仮説的に言えば、

abstract class Foo {
    public abstract void method();
}

class MyClass extends MyBaseClass, Foo {
    public void method() { ... }
}

関連する質問(ほとんど重複!):

于 2012-05-14T08:38:31.923 に答える
0

それでも違いはあると思います。インターフェースは、多重継承の制限が取り除かれたとしても、実装があなたに属する契約です。Javaでは、インターフェースを使用して多重継承動作を導き出すことができますが、それはすべての機能をもたらすとは限りません。実際の多重継承の(スーパークラスの呼び出しなど)これは一種の手法にすぎません。

抽象クラスは部分的なオブジェクトエンティティであり、完全な実装も含まれる場合があります。したがって、複数のクラスを拡張できる場合でも、インターフェイスで行う操作は異なります。Javaでは、多重継承と抽象クラスおよびインターフェイスは異なると思います。

于 2012-05-14T08:40:10.997 に答える
0

インターフェイスはすでに、パブリック抽象メソッドのみを許可する特別な抽象クラスタイプです。

これは、ダイヤモンドが許可されていない契約を遵守することを強制するパターンです。

したがって、抽象クラスに実装がないかどうかをチェックできるコンパイラを作成する場合は、すべてのインターフェイスを抽象クラス(このコントラクトに従う)に置き換えることができます。

于 2012-05-14T10:04:01.617 に答える