ArrayList<Animal>にDogクラスをつっこむと、参照の型がAnimalに変更されるというのは解ったけど、メソッドを呼び出したときにAnimalとDog、どっちの型のメソッドが呼び出されるんだろうということが気になったので、テストコードを作ってみた。
import java.util.ArrayList; public class PolymorphismTest { public static void main(String[] args) { ArrayList<Animal> myAnimalArrayList = new ArrayList<Animal>(); Dog aDog = new Dog(); myAnimalArrayList.add(aDog); myAnimalArrayList.get(0).makeNoise(); } } public class Animal { public void makeNoise() { System.out.println("Animal's makeNoise()"); } } public class Dog extends Animal { public void makeNoise() { System.out.println("Dog's makeNoise()"); } }
出力結果:
Dog's makeNoise()
ということで、呼び出されるのはDogのmakeNoise()だった。下に書いたコードのように、参照の型がもっていないメソッドを呼び出そうとするとコンパイルエラーになるだけで、メソッドをもっていた場合は、実際のオブジェクトのものを呼び出すということなのかな。
// コンパイルエラーになる public class PolymorphismTest { public static void main(String[] args) { ArrayList<Object> myAnimalArrayList = new ArrayList<Object>(); Dog aDog = new Dog(); myAnimalArrayList.add(aDog); myAnimalArrayList.get(0).makeNoise(); } }
こうやってテストコードを書いてみるってのも勉強になって楽しいもんだなあ。
しかしreferenceってただ単に参照って訳しちゃうとなんか違うような気がして微妙だ。本当はなんて呼ぶんだろう。