Javaによるオーバーライドとは?オーバーライドの基本と使い方を解説

- システム
エンジニア - Javaのオーバーライドとは、どういうものですか。
- プロジェクト
マネージャー - メソッドを上書きすることです。ただし、いくつかのルールがあります。
Javaのオーバーライド
Javaのオーバーライドを知っていますか。既存クラスのメソッドについて、変更したいメソッドだけを記述し直すだけで、メンバ変数や他のメソッドをあらためて記述する必要がありません。
このため、変更が必要な場合においても、変更する箇所も少なくできるというメリットがあります。オーバーライドは「メソッドを再利用しつつも、変えたいところは自由に変えられる」という意味です。
オーバーライドとは
Javaでは、クラスを継承した際に継承元になっているスーパークラスで定義されているメソッドを、継承したサブクラスで同じメソッド名で書き換えることができます。これをオーバーライドといいます。要するに、メソッドを上書きするということです。
オーバーライドする際には、メソッド名を同じにする必要があるのに加えて、メソッドの引数は同じ数、同じ順番にしなければなりません。
オーバーロードとの違い
Javaではオーバーライドと似た仕組みとして「オーバーロード」があります。オーバーロードとは、同じメソッド名で引数の数や順番が違うメソッドを定義することです。
1 2 3 4 5 6 7 8 9 10 11 |
private static int hoge(int n1, int n2, int n3){ return n1 + n2 + n3; } // オーバーロード(同じメソッド名で引数の数や順番が違うメソッドを定義) private static double hoge(double d1, double d2){ return d1 + d2; } |
この記事では、オーバーライドについて解説していきます。
オーバーライドしてみる
実際のJavaのサンプルコードでオーバーライドしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// スーパークラス class SuperClass { public void calc(int n1){ System.out.println(""super class""); System.out.println(""n1 * 2 = "" + (n1 * 2)); } } //サブクラス class SubClass extends SuperClass { @Override public void calc(int n1){ System.out.println(""sub class""); System.out.println(""n1 * 3 = "" + (n1 * 3)); // サブクラスの処理を変更 } } public class Main { public static void main(String[] args) { SuperClass superClass = new SuperClass(); superClass.calc(2); SubClass subClass = new SubClass(); subClass.calc(2); } } |
出力結果は以下のようになります。
1 2 3 4 |
super class n1 * 2 = 4 sub class n1 * 3 = 6 |
スーパークラスのcalcメソッドと、サブクラスのcalcメソッドでは出力結果が異なることが分かります。サブクラスのcalcメソッドでは、メソッドの処理を変更しています。
オーバーライドのルール
オーバーライドを行うサブクラスでは、スーパークラスのメソッドと以下を全て一致させなければなりません。
・メソッド名
・引数の数
・引数の型
・引数の並び順
・戻り値の型
また、オーバーライドをされるメソッドはアクセス修飾子をprivate以外に設定してください。このルールを守らなければ、コンパイルエラーになります。
@Override(アノテーション)について
サンプルコードでは、サブクラスのcalcメソッドの前に@Overrideと記述しています。
1 2 3 4 5 |
class SubClass extends SuperClass { @Override public void calc(int n1){ |
これをアノテーションと呼びます。@Overrideアノテーションは、記述するメソッドがスーパークラスのメソッドをオーバーライドしていることを明示します。
このアノテーションを付与すると、スーパークラスにないメソッドを記述するとコンパイルエラーが発生します。メソッド名の誤記などを防止することができます。
試しにオーバーライドメソッドcalcを「calo」という名称に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//サブクラス class SubClass extends SuperClass { @Override public void calo(int n1){ // メソッド名をcaloに誤って記載 System.out.println(""sub class""); System.out.println(""n1 * 3 = "" + (n1 * 3)); // サブクラスの処理を変更 } } public class Main { public static void main(String[] args) { SuperClass superClass = new SuperClass(); superClass.calc(2); SubClass subClass = new SubClass(); subClass.calo(2); } |
@Overrideアノテーションを付与しているため、以下のようなコンパイルエラーとなります。
1 |
error: method does not override or implement a method from a supertype |
@Overrideアノテーションをコメントアウトすると、caloメソッドも問題なくコンパイルでき、実行することもできます。
Javaではメソッドの名の誤記などを防止するためにも、@Overrideアノテーションは付与しておいたほうが良いです。
super句の使い方
Javaでは「super」句を使うことによって、サブクラスでオーバーライドしていてもスーパークラスのメソッドをそのまま使うことができます。
実際にJavaのサンプルコードで確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// スーパークラス class SuperClass { public void calc(int n1){ System.out.println(""super class""); System.out.println(""n1 * 2 = "" + (n1 * 2)); } } //サブクラス class SubClass extends SuperClass { @Override public void calc(int n1){ System.out.println(""sub class""); //System.out.println(""n1 * 3 = "" + (n1 * 3)); // サブクラスの処理を変更 super.calc(n1); // スーパークラスと同じ処理 } } public class Main { public static void main(String[] args) { SuperClass superClass = new SuperClass(); superClass.calc(2); SubClass subClass = new SubClass(); subClass.calc(2); } } |
実行結果は以下のようになります。
1 2 3 4 5 |
super class n1 * 2 = 4 sub class super class n1 * 2 = 4 |
サブクラスのcalcが呼び出された後、スーパークラスのcalcが呼び出されていることが分かります。
このように「super」句を使うことによって、サブクラスでオーバーライドしていてもスーパークラスのメソッドをそのまま使うことができます。
- システム
エンジニア - super句という方法もあるのですね。
- プロジェクト
マネージャー - そうなのです。「super」句を使えば、サブクラスでオーバーライドしていてもスーパークラスのメソッドをそのまま使うことができるのです。
Javaのオーバーライドの理解を深めよう
ここでは、Javaのオーバーライドやアノテーション、およびsuper句の使い方について説明しました。
Javaではクラスを継承してメソッドをオーバーライドすることで、後々で処理を変更することができるのでとても便利です。
また、サブクラスでsuper句を使用することによって、スーパークラスのメソッドをそのまま使用することもできます。オーバーライドを使用する際にはいくつかのルールがありますので、注意してください。
ぜひご自身でコードを組んで、オーバーライドに対する理解を深めてください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅)販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅)生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅)社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅)金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅)大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)