オーバーロードはメソッド名が同じで引数が違うメソッドです。
それに対してオーバライドは親クラスのメソッド名が同じで引数が同じメソッドのことを言います(ものすごく簡単にいうと)。
どのメソッドを呼び出すかどうか自分自身混乱しそうなので、
どのような呼び出しルールなのか確認用のサンプルを作成しました。
public class Test {
public static void main(String[] args) {
Animal[] animal = { new Animal(), new Dog(), new Cat()};
for (Animal a : animal) {
new Test().method(a);
}
for (Animal a : animal) {
a.method();
}
}
void method(Animal animal) {
System.out.println("overload:animal");
}
void method(Cat cat) {
System.out.println("overload:cat");
}
void method(Dog dog) {
System.out.println("overload:dog");
}
}
class Animal {
public void method() {
System.out.println("override:animal");
}
}
class Dog extends Animal {
@Override
public void method() {
System.out.println("override:dog");
}
}
class Cat extends Animal {
@Override
public void method() {
System.out.println("override:cat");
}
}
■実行結果
$ java Test overload:animal overload:animal overload:animal override:animal override:dog override:cat
実行結果から呼び出しルールについて以下のことが確認できます。
オーバロード:変数の型を元に呼び出すメソッドを決定
Animal animal = new Dog()のように実体がDogでも呼び出されるのは引数がAnimalのmethodになります。
オーバライド:変数の実体を元に呼び出すメソッドを決定
Animal animal = new Dog()であれば実体がDogなので呼び出されるのはDogのメソッドになります。