オーバーロードとオーバーライド

JavaBeginner
オンラインで実践に進む

はじめに

この実験では、メソッドのオーバーロードとオーバーライドについて学びます。オーバーライドとオーバーロードは、Java プログラミング言語で使用される 2 つの概念です。これらの概念の両方により、プログラマは同じ名前のメソッドに対して異なる実装を提供できます。オーバーロードはコンパイル時に発生し、オーバーライドは実行時に発生します。静的メソッドはオーバーロードできますが、オーバーライドできません。オーバーロードは静的バインドであり、オーバーライドは動的バインドです。

オーバーロード

前のセクションでは、クラス Person に 3 つのコンストラクタがあるため、既にオーバーロードを使用していました。これは簡単な例です。オーバーロードは、クラスが同じ名前の複数のメソッドを持つことを可能にする機能です。これにより、異なる状況を処理でき、混乱することがなくなります。通常、オーバーロードを達成する方法は 3 つあります。

  • パラメータの数が異なる
  • パラメータの型が異なる
  • 異なる型のパラメータの順序が異なる

例:

/home/labex/project/overloadingTest.java ファイルに次のコードを記述します。

public class overloadingTest{
    public static void main(String[] args){
        overloadingTest test = new overloadingTest();
        System.out.println("add(10,20)= " + test.add(10,20));
        System.out.println("add(10,20,30)= " + test.add(10,20,30));
        System.out.println("add(5.5, 10.5)= " + test.add(5.5f, 10.5f));

        test.printInfo(1, "an error!");
        test.printInfo("another error!", 2);
    }
    // このメソッドは 2 つの int 型のパラメータを持ち、整数を返します
    int add(int a, int b){
        return a+b;
    }
    // このメソッドは 3 つの int 型のパラメータを持ち、整数を返します
    int add(int a, int b, int c){
        return a+b+c;
    }
    // このメソッドは 2 つの float 型のパラメータを持ち、浮動小数点数を返します
    float add(float a, float b){
        return a+b;
    }
    // このメソッドは 1 つの string 型のパラメータと 1 つの int 型のパラメータを持ち、何も返しません
    void printInfo(String str, int code){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
    // このメソッドは 1 つの int 型のパラメータと 1 つの string 型のパラメータを持ち、何も返しません
    void printInfo(int code, String str){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
}

出力:

次のコマンドを使用して overloadingTest.java ファイルを実行します。

javac /home/labex/project/overloadingTest.java
java overloadingTest

出力を確認します。

add(10,20)= 30
add(10,20,30)= 60
add(5.5, 10.5)= 16.0
Code: 1
Message: an error!
Code: 2
Message: another error!

オーバーライド

あるクラスがスーパークラスからメソッドを継承している場合、そのメソッドが final または private としてマークされていない限り、そのメソッドをオーバーライドする機会があります。オーバーライドにより、サブクラス固有の動作を定義できます。つまり、サブクラスは親クラスのメソッドを自身の要件に基づいて実装できます。オブジェクト指向プログラミング(OOP)において、オーバーライドとは既存のメソッドの機能を上書きすることを意味します。戻り値の型は、スーパークラスの元の(オーバーライドされた)メソッドで宣言された戻り値の型と同じか、そのサブタイプでなければなりません。アクセスレベルは、オーバーライドされたメソッドのアクセスレベルよりも制限的であってはなりません。たとえば、スーパークラスのメソッドが public と宣言されている場合、サブクラスのオーバーライドメソッドは private または protected であってはなりません。また、Animal のケース(単純なバージョン)も使います。

例:

/home/labex/project/overridingTest.java ファイルに次のコードを記述します。

class Animal{
    public void grow(){
        System.out.println("I'm animal, I grow up.");
    }
    public void sleep(){
        System.out.println("I'm animal, I am sleeping.");
    }
}
class Dog extends Animal{
    // オーバーライドメソッド
    public void grow(){
        System.out.println("I'm dog, I grow up.");
    }
}
class Bird extends Animal{
    // スーパークラスの grow() を維持し、独自の文を追加する
    // オーバーライドメソッド
    public void grow(){
        super.grow();
        System.out.println("I'm bird, I grow up.");
    }
    // オーバーライドメソッド
    public void sleep(){
        System.out.println("I'm bird, I am sleeping...");
    }
    // Bird 独自のメソッド
    public void sing(){
        System.out.println("I'm bird, I am singing a song...");
    }
}
public class overridingTest{
    public static void main(String[] args){
        Dog dog = new Dog();
        dog.grow();
        Bird bird = new Bird();
        bird.grow();
    }
}

出力:

次のコマンドを使用して overridingTest.java ファイルを実行します。

javac /home/labex/project/overridingTest.java
java overridingTest

出力を確認します。

I'm dog, I grow up.
I'm animal, I grow up.
I'm bird, I grow up.

まとめ

大規模なプロジェクトを組織するには、優れたアーキテクチャの考えが必要です。そのため、この実験で扱った基本的な概念を知っておく必要があります。オーバーライドとオーバーロードは、メソッドを利用する際の柔軟性を提供します。