前置き
Java Silverを最近勉強したのだが、これはオーバーライド?それともオーバーロードだろうかと分からなくなることがある。どちらもとても大切な手段だが、とにかく名前が紛らわしい!以下ではコードも用いて違いを見ていく
オーバーロードについて
プログラミングの困りごと
プログラムを書いている時にこのような場面が出てくる。
public satic int add(int x,int y) {
return x + y;
}
これは引数のxとyに値を入れると、xにyを足した値を返してくれるメソッドである。例えばx=2、y=3を引数として渡すと、合計した5が返ってくる、という具合。
このaddというメソッドはとても便利なので、他の処理にも使いたいと思う機会があるかもしれない。ただしここで注意すべきなのは、メソッドに同じ名前はつけられないである。JVM(読みこんだファイルをCPUに送るといった役割)がどのメソッドを使えば良いか分からなくなるのである。
オーバーロード(多重定義)を使用する
そこでオーバーロードを使う。日本語名だと多重定義であり、引数が異なれば同じ名前のメソッドを定義することが可能になる。例えばもう1つaddメソッドを作りたい場合、以下のメソッドなら作成可能である。
これは引数の数はそのままで、引数の型がdouble型になっている。
public satic double add(double x,double y) {
return x + y;
}
また、引数の数を変えて定義することも可能である。
public satic int add(int x,int y,int z) {
return x + y + z;
}
以上のように、同じ名前のメソッドを定義することをオーバーロードという。
オーバーライドについて
オブジェクト指向の1つ、継承との関わり
継承は簡単に言うと似たようなクラスを作ることができる機能である。
public class A {
public void sleep(){
System.out.println("Aは眠った");
}
}
public class B extends A{
}
上記のコードはAというクラスを用意し、その中でsleepメソッドを準備している。
さらにBクラスはAクラスを継承している状態である。
この状態でBクラスのインスタンスを生成し、sleepメソッドを動かしてみる。
public class Main{
public static void main(String[] args) {
B b = new B();
b.sleep();
}
}
すると「Aは眠った」と結果に出力される。
しかし、今回はBのインスタンスを生成しているのに、「Aは眠った」と出力されるのは違和感がある。そこで、Bクラス専用のsleepメソッドを定義しよう。
オーバーライド(再定義)を使用する
今度は以下のようにBクラス内にsleepメソッドを追記してみる。ここで注意するのは、引数リストの定義は、型・数・順番の全てが同じでなければいけないということだ。今回は渡す引数は無いので、空のまま実装する。
public class B extends A{
public void sleep(){
System.out.println("Bは眠った");
}
}
ではBクラス内にsleepメソッドを定義した状態で以下のコードを実行してみる。
public class Main{
public static void main(String[] args) {
B b = new B();
b.sleep();
}
}
結果は「Bは眠った」と出力され、無事Bクラスで定義した内容が出力されることを確認できた。
上記のように、親クラスのメソッドを子クラス側で上書きすることをオーバーライドという。