はじめに
Javaではクラスの多重継承ができませんが、例外的にインターフェースのみ多重継承が許されています。なぜこうした例外が許されているのでしょうか。
初心者向けの記事です。なぜこんな言語仕様にしたのか、といった話はしないのでよろしくお願いします。
多重継承ができない理由
一言で言うと親クラスが同名のメソッドを持っていた場合、子クラスの処理内容に矛盾が生じる可能性がからです。
便宜的にParent1とParent2の2つのクラスを用意します。
public class Parent1 {
public void sing() {
System.out.println("演歌を歌う");
}
}
public class Parent2 {
public void sing() {
System.out.println("ロックを歌う");
}
}
2つのクラスは同名のsingメソッドを持っていますが、処理内容が異なります。
もし、Parents1とParents2の2つを多重継承する子クラスが存在する場合、singメソッドはどうなるでしょうか?結論、どちらの親のsingメソッドの処理を優先してよいか分からず、処理内容が定まりません。
インターフェースの多重継承が可能な理由
一言で言うと、親クラスが同名のメソッドを持っていても、処理内容が未定義なので、小クラスの処理内容に矛盾が生じないからです。
上記のParent1とParent2をインターフェースにすると下記になります。singメソッドが未定義なので実質同じメソッドになります。そのためParent1とParent2を同時に継承したとしても、クラスの多重継承のようにメソッドの処理が矛盾しません。このため、インターフェースの多重継承が許されているのだと思います。
public interface Parent1 {
void sing();
}
public interface Parent2 {
void sing();
}
参考資料