クラス宣言で extends が implement に先行する理由を示す例があります。
インターフェイス:
public interface IParent {
void getName();
void getAddress();
void getMobileNumber();
}
抽象クラス:
public abstract class Parent {
public abstract void getAge();
public void getName(){
System.out.print("the parent name");
}
}
子クラス :
public class Child extends Parent implements IParent {
@Override
public void getAddress() {
System.out.print(" Child class overrides the Parent class getAddress()");
}
@Override
public void getMobileNumber() {
System.out.print(" Child class overrides the Parent class getMobileNumber()");
}
@Override
public void getAge() {
//To change body of implemented methods use File | Settings | File Templates.
}
}
インターフェイスと抽象クラスの両方に同じメソッド getName() があることを確認すると、抽象クラスではメソッドに実装があります。
実装しようとすると、クラスがインターフェイスのすべての抽象メソッドをオーバーライドすることが必須になり、メソッド getName() の実装が既にある抽象クラスを拡張しようとしています。
Child クラスのインスタンスを作成し、メソッド getName() を
Child child = new Child();
child.getName();
同じメソッド getName() に対して 2 つの実装が存在するため、子がどのメソッド実装を呼び出すかについて競合が発生します。
この競合を回避するために、最初に拡張し、後でインターフェースを実装することが必須になりました。
したがって、抽象クラスにインターフェースと同じメソッドがあり、抽象クラスがすでにメソッドを実装している場合、子クラスの場合、そのメソッドをオーバーライドする必要はありません