インタフェースと継承
JAvaは、1つのクラスが複数の直接親を継承することを許さない.なぜなら、子クラスが親クラスのインスタンスメソッドを上書きしたり、親クラスのメンバー変数や静的メソッドを非表示にしたりする場合、java仮想マシンは異なるバインドルールを採用し、1つのクラスに複数の直接親を許可すると、バインドルールがより複雑になるため、システム構造とダイナミックバインドメカニズムを簡略化するためにjava言語はマルチ継承を禁止する.たとえば、AクラスとBクラス(class C extends A,B{})を同時に継承できるクラスCがあり、AクラスとBクラスの両方に同じメソッドfun()がある場合、定義:
C c = new C();
では、c.fun()はどの親クラスのfun()メソッドを呼び出すべきですか.答えが出せないため、Java言語では多重継承が禁止されています.
1つのクラスは、複数のインタフェースを実装することができ、同時に実装される2つのインタフェースに同じ方法fun()がある場合、実装結果は、1つ、例えば、
ではccはAAとBBを同時に実現した結果、
しかしBBの方法がこれに変更されたら:
では、CCでAAとBBを同時に実現した場合、エラーが報告されます.これは同じクラスに2つのメソッドが書かれているようなもので、メソッド名が同じで、パラメータリストが同じで、戻り値が異なるため、リロード(メソッド名が同じで、パラメータクラステーブルの順序、個数が異なる)ではないので、エラーが報告されます.注意してください.
C c = new C();
では、c.fun()はどの親クラスのfun()メソッドを呼び出すべきですか.答えが出せないため、Java言語では多重継承が禁止されています.
1つのクラスは、複数のインタフェースを実装することができ、同時に実装される2つのインタフェースに同じ方法fun()がある場合、実装結果は、1つ、例えば、
public interface AA {
public void fun();
}
public interface BB {
public void fun();
}
ではccはAAとBBを同時に実現した結果、
public class CC implements AA, BB {
public void fun() {
// TODO Auto-generated method stub
}
}
しかしBBの方法がこれに変更されたら:
public interface BB {
public String fun();
}
では、CCでAAとBBを同時に実現した場合、エラーが報告されます.これは同じクラスに2つのメソッドが書かれているようなもので、メソッド名が同じで、パラメータリストが同じで、戻り値が異なるため、リロード(メソッド名が同じで、パラメータクラステーブルの順序、個数が異なる)ではないので、エラーが報告されます.注意してください.