オーバーロードとオーバーライドについてまとめます
#オーバーロード
名前は同じだがシグニチャの違うメソッドを複数定義すること。
→名前は同じでもメソッドとしては別物
※シグニチャとは
・メソッド名
・引数リストの型
・引数の数
・引数の順番
【オーバーロード時に考慮しないもの】
・戻り値の違い
・引数の変数名
・アクセス修飾子の違い
例)
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);
}
}