Javaを学んでいるとオーバーライドという機能が出てきます。
似た言葉にオーバーロードというものも存在し、初心者の方ですとこんがらがってしまうかもしれません。
オーバーライドはクラスの継承を実施する上で切っても切れない関係にある機能です。
今回はそんなオーバーライドについて初心者の方でもわかるように例などを用いて解説していきます。
オーバーライドとは?
ではそもそもオーバーライドとは何なのでしょうか?
オーバーライドはクラスを継承した際に親クラスで定義したメソッドと同じメソッド名・引数名・引数の型・引数の数・戻り値の型・引数の順番などを子クラスで再度定義するというものです。
因みに継承とは何なのか?という方は、下記記事で解説していますので、一度読んでみてください。
【Java】継承とは何なのか?といった疑問を解決!! | エンジニアKISARAGIの備忘録 (kisaragi-it.com)
では何のためにそんなことをしているかというと、親クラスで定義したメソッドでの機能とは異なる機能が付与されているメソッドを子クラスで再定義するためです。
言葉で解説しても分かりにくいと思いますので、実際のコードを見ていきましょう。
【コード】
public class OverrideParent {
public void override() {
System.out.println("親クラスのメソッド");
}
}
public class OverrideChild extends OverrideParent{
@Override
public void override() {
super.override();
System.out.println("子クラスのメソッド");
}
public static void main(String[] args) {
OverrideParent op=new OverrideParent();
OverrideChild oc=new OverrideChild();
op.override();
oc.override();
}
}
【出力結果】
親クラスのメソッド
子クラスのメソッド
上記はOverrideParentというクラスと、OverrideChildというOverrideParentクラスを継承したクラスとなっています。
そして親クラスのOverrideParentでは「親クラスのメソッド」と出力するための処理が記載されています。
しかし子クラスでは親クラスと同様のメソッド名等ですが、「子クラスのメソッド」という文字列を出力するための処理が記載されています。
このように親クラスと同様のメソッド名ですが、異なる処理を実施したいとなった場合にオーバーライドを実施いたします。
因みにmainメソッド以外のメソッドを使用する場合はインスタンス化を実施する必要がありますが、インスタンス化については下記記事で詳しく解説しているので、わからないという方はそちらも合わせて読んでみてください。
【Java】インスタンスとは何なのか? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)
@Overrideとは?
先ほど親クラスと子クラスのメソッドをpublicというアクセス修飾子で定義しました。
アクセス修飾子については下記記事で解説していますので、わからないという方は一度読んでみてください。
【Java】変数の宣言と初期化方法 | エンジニアKISARAGIの備忘録 (kisaragi-it.com)
親クラスのアクセス修飾子をpublicからprivateに変更したらどうなると思いますか?
privateは他クラスからのアクセスはできないという特徴があります。
そのためmainメソッドからOverrideParentのメソッドへのアクセスは下記のようにエラーとなります。
しかし子クラスのoverrideメソッドでは特にエラーは出ていません。
そのためオーバーライドはおそらく機能していないだろうということは分かりますが、本当に機能していないのかは見た目だけでは分かりません。
仮に「op.override();」の部分もコメントアウトした場合下記のようにコンパイルエラーは何も表示されなくなり、普通に実行できてしまいます。
これではバグの原因になる可能性も出てきてしまいます。
そこで使用するのがOverrideアノテーションというものです。
下記のように子クラスのメソッド前に「@Override」という文字列を追加するだけです。
@Override
public void override() {
System.out.println("子クラスのメソッド");
}
これだけでオーバーライドに何か問題があれば、下記のようにoverrideメソッドでコンパイルエラーが発生いたします。
このOverrideアノテーションを使用することでバグの発生を抑制することもできますので、ぜひ活用していきたい機能です。
super句について
最後にオーバーライドした子クラスのメソッドから親クラスのメソッドを呼び出すことも可能なので、その方法についても解説していきます。
そこまで難しいものではなく下記のように「super.override();」というようにsuper句を使用することで親クラスのメソッドへのアクセスが可能になります。
【コード】
public class OverrideParent {
public void override() {
System.out.println("親クラスのメソッド");
}
void override2() {
System.out.println("親クラスの異なるメソッド");
}
}
public class OverrideChild extends OverrideParent{
@Override
public void override() {
super.override();
System.out.println("子クラスのメソッド");
}
public static void main(String[] args) {
OverrideParent op=new OverrideParent();
OverrideChild oc=new OverrideChild();
op.override();
oc.override();
}
}
【実行結果】
親クラスのメソッド
親クラスのメソッド
子クラスのメソッド
まとめ
この記事ではJavaのオーバーライドについて解説してきました。
- オーバーライドとは?
- @Overrideとは?
- super句について
オーバーライド機能を使用することで、コードの修正量を減らすことができたり、バグの発生も抑えることができます。
ぜひこの機会にマスターしてみてください。
以上で今回の解説は終了となります。
コメント