オーバーライドとは
オーバーライドは、親クラスのメソッドを上書きして再定義することです。
親クラスを継承した子クラスで、親クラスのメソッドと同じメソッド名、引数リスト、戻り値型のメソッドを定義することでオーバーライドされます。
以下、オーバーライドのルールです。
- メソッドのシグニチャが全く同じである。
(シグニチャとは メソッド名、引数の数、引数の型、引数の並び順で構成された情報のこと) - 戻り値型は同じか、継承元の型のサブクラスであること(共変戻り値)
- 継承元メソッドにthrows句が指定されている場合、サブクラス側で指定しなくてもオーバーライドとして認識される。
- 継承元メソッドにthrows句が指定されている場合でサブクラス側もthrows句を指定する場合は、継承元と同じExceptionクラスか、そのサブクラスでなければならない。
- アクセスレベルは継承元と同じか、より広いアクセスレベルであれば指定可能。
(アクセスレベルは下げる事はできない(継承元がpublicだが、オーバーライド側がprivateを指定するなど)) - 継承元メソッドにfinal修飾子が指定されている場合は、オーバーライドはできない。
- RuntimeExceptionおよびRuntimeExceptionサブクラスの例外は、スーパークラスの例外に関係なくスローできる
- スーパークラスでスローしていてもサブクラスでスローしないことは可能
オーバーライドサンプル
オーバーライドのサンプルコードです。
- (OyaClass.java)
-
public class OyaClass { //メソッドA public void methodA(){ System.out.println("Oya-methodA"); } //メソッドB public void methodB(){ System.out.println("Oya-methodB"); } }
- (KoClass.java)
-
public class KoClass extends OyaClass{ //メソッドBをオーバーライド @Override public void methodB(){ System.out.println("Ko-methodB"); } }
- (Test.java)
-
public class Test { public static void main(String[] args){ KoClass ko = new KoClass(); ko.methodA(); ko.methodB(); } }
- (実行結果)
- C:\>java Test Oya-methodA Ko-methodB
Koクラスでは、methodBのみオーバーライドしています。
KoクラスのmethodAを呼ぶとOyaクラスのmethodAが実行され、methodBを呼ぶとKoクラスのmethodBが実行されます。
コメント