15
10

More than 3 years have passed since last update.

【Java】オーバーロードとオーバーライド

Last updated at Posted at 2020-10-05

オーバーロードとオーバーライドについてまとめます

オーバーロード

名前は同じだがシグニチャ違うメソッドを複数定義すること。
→名前は同じでもメソッドとしては別物

※シグニチャとは
・メソッド名
・引数リストの型
・引数の数
・引数の順番

【オーバーロード時に考慮しないもの】
・戻り値の違い
・引数の変数名
・アクセス修飾子の違い

例)

int price(int a, double b){
   return a * b;
}

【オーバーロードするパターン】

double price(int a){   //別メソッド扱いなので戻り値を変えても問題ない。シグニチャが異なっているのでオーバーロード 
  //処理
}

int price(double a, int b){  //引数の順番が逆→オーバーロード
  //処理
}

finalがついているメソッドをオーバーロードすることも可能

final void price(){
   //処理
}

void prince(int a){  //finalメソッドもオーバーロード可能!別メソッド扱いだから。
  //処理
}

【オーバーロードにならないパターン】

int price(int product, double tax){  //引数名はシグニチャではない。オーバーロードにならない
   //処理
}

オーバーライド

親クラス継承して子クラスを宣言する際に、親クラスのメンバを子クラスで上書きすること。

【オーバーライドの条件】
・シグニチャが同じであること
戻り値型は親クラスのメンバと同じ型サブクラス型であること
アクセス修飾子は親クラスのメンバと同じかより緩いものを指定すること
・親クラスのメンバにfinalがついていないこと
・throwsで宣言する例外は、スローする例外と同じ型かサブクラスであること

例)

class Infant{
  protected void talk(){
     System.out.println("おぎゃあ");
  }
} 

【オーバーライドできるパターン】

class Adult extends Infant {
  public void talk(){   //親クラスのtalkメソッドより緩いアクセス修飾子
    System.out.println("こんにちは");
 }
}

【オーバーライドできないパターン】

class Adult extends Infant {
  void talk(){   //親クラスのtalkメソッドより厳しいアクセス修飾子
    System.out.println("こんにちは");
 }
}

class Adult extends Infant {
  void talk(String a){   //親クラスのtalkメソッドと異なるシグニチャ(オーバーロードになる)
    System.out.println("こんにちは" + a);
 }
}
15
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10