2012年2月5日日曜日

オーバーロード・オーバライドされたメソッドを呼び出すルール

javaにはオーバーロードとオーバロードという仕組みがあります。
オーバーロードはメソッド名が同じで引数が違うメソッドです。
それに対してオーバライドは親クラスのメソッド名が同じで引数が同じメソッドのことを言います(ものすごく簡単にいうと)。

どのメソッドを呼び出すかどうか自分自身混乱しそうなので、
どのような呼び出しルールなのか確認用のサンプルを作成しました。

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のメソッドになります。

0 件のコメント:

コメントを投稿