1

この記事の目次



1.  オーバーロード


 ●  概念

  • オーバーロードとは同一クラス内でメソッド名が同一で引数の型、数、並び順が異なるメソッドを複数定義することです。
  • ただし、同じシグネチャ(signature)のメソッドはオーバーロードできません。メソッドのシグネチャとは、メソッド名と仮引数の個数と型の組合のことでです。返却型が含まれません。
  • 「同じシグネチャのメソッドはオーバーロードできない」ことを言い換えると、どのメソッドを呼び出すべきかが呼び出し側で明確に区別できるように、仮引数の型や個数が異なっていなければ、オーバーロードできないということです。
  • メソッド呼び出し時、どのメソッドを呼び出すかといった指定は不要です。それぞれに適したメソッドが自動的に選択されて呼び出されるからです。
  • オーバーロードのメリット:類似した処理を行うメソッドをオーバーロードすれば、プログラムが多くのメソッド名で溢れかえるのを抑止できることです
  • オーバーロードを日本語訳で表記すると多重定義と言います。
  •  ●  例題

    オーバーロードの例題
    package helloworld;
    
    public class HelloWorld {
            
        public static void main(String[] args) {
            self("青山");
            self("青山", 18);
        }
          
        static void self(String name) {
            System.out.println("私は" + name + "です");                       
        }
        static void self(String name, int age) {
            System.out.println("私は" + name + "です。" + age + "歳です。");                       
        }
          
    }

    実行結果:
    私は青山です
    私は青山です。18歳です。
  • このサンプルコードでは、同じメソッド名で引数の数が違う2つのメソッドselfを実行しています。
  • メソッドを呼び出して引数を指定する際にString型の変数を1つ指定すれば、String型の引数を1つ持つメソッドが呼び出されて実行されています。
  • また、String型の変数とint型の変数を指定すればString型の変数とint型の変数を持つメソッドが呼び出されて実行されています。
  • このように、同じメソッド名の中からどのメソッドを呼び出すかは、指定する引数の型や数、順番、いわゆるシグネチャを元にコンパイラーが判断してくれるようになっています。それにより、同じシグネチャのメソッドはオーバーロードできません。
  • 2.  オーバーライドとは


     ●  オーバーライドとは

  • オーバーライドとはスーパークラスにおいて定義されているメソッドを、サブクラス内で再定義することを言います。ちなみに、スーパークラスとは継承され親となるクラスのことで、サブクラスとは継承したクラスのことです。
  • スーパークラスのメソッドを変更することはできないが、サブクラスに特化した機能を付与したい場合に使用します。
  •  ●  オーバーライドのメリット

  • メソッドの変更が必要な場合に変更箇所が少なくて済みます。
  • クラスのメンバ変数などはそのまま再利用して、変更したいメソッドだけを再定義することができます。
  •  ●  例題

    オーバーライドの例題
    package helloworld;
    
    // スーパークラス
    class ClassSuper {
        int a = 10;
        int b = 2;
     
        public void calc(){
            System.out.println("a + b = " + (a + b));
        }
    }
    //サブクラス
    class ClassSub extends ClassSuper{
        @Override
        public void calc(){
            super.calc();
            // 処理を変更
            System.out.println("a - b = " + (a - b));
            System.out.println("a * b = " + (a * b));
            System.out.println("a / b = " + (a / b));
            
        }
    }
    
    public class HelloWorld {
            
        public static void main(String[] args) {
            ClassSub ab = new ClassSub();
            ab.calc();
            
        }
          
    }

    実行結果:
    a + b = 12
    a - b = 8
    a * b = 20
    a / b = 5
  • この例でもClassSubクラスがClassSuperクラスを継承しています。
  • スーパークラスであるClassSuperクラスのcalcメソッドをClassSubクラスでオーバーライドして処理を変更しています。
  • ClassSubクラスのcalcメソッドでsuper句を使うことで、スーパークラスであるClassSuperクラスのcalcメソッドのそれと一致します。つまり、サブクラスでオーバーライドしていてもスーパークラスのメソッドをそのまま使うことができます。
  • 3.  オーバーライドの規定


     ●  @Override(アノテーション)

  • オーバーライドで再定義するメソッドの前に「@Override」と記述した方がいいですが、記述しなくても問題はありません。
  • アノテーションはオーバーライドすることを宣言するために記述します。これを記述することで、もしスーパークラスに同名のメソッドがなければコンパイラがエラーメッセージを出しますので、アノテーションをつけるべきです。
  •  ●  戻り型とシグネチャ

  • オーバーライドする側はオーバーライドされる側と戻り型、とシグネチャ、(メソッド名、引数型、引数の数)が同じでなければなりません。どれか一つでも異なる場合はオーバーライドとは見なされません。
  •  ●  アクセスレベル

  • オーバーライドされる側のメソッドに指定されるアクセスレベルより厳しい制限を持つアクセスレベルをオーバーライドする側のメソッドに付与することはできません。
  • 例えばオーバーライドされる側のメソッドにprotectedが指定されている場合、オーバーライドする側のメソッドにprivateを指定することはできません。
  • アクセスレベルは以下に参考してください。
  •  メソッドの頭部について詳しく見たい方:

    メソッドの頭部

    ../../../java/java-method-basic.html?goto=2to1

    メソッドとは複数の文をまとめ、それを1つの処理として名前をつけたもので、部品の最小単位です。この記事ではJAVAのメソッドの概念、メリット、・・・

     ●  throw

  • throwは例外を意図的に起こし、例外処理を実行する場合に使われます。
  • オーバーライドするメソッドで、スーパークラス側のメソッドのthrowsで指定した例外クラス以外を指定することはできません。
  • 但し、オーバーライドされる側に指定された例外をより限定する例外をオーバーライドする側に指定することはできます。
  •  ●  final修飾子

    スーパークラス側のメソッドにfinal修飾子が付与されている場合は、サブクラスでそのメソッドのオーバーライドはできません。

     ●  abstract修飾子

    スーパークラス側のメソッドにabstract修飾子が付与されている場合は、サブクラスでは必ずオーバーライドする必要があります。オーバーライドしない場合はそのサブクラス全体がabstractクラスになります。

    4.  演習問題


    広告