public class Dog extends Animal {
public Dog(String name){
super(name);
}
// abstract class ではないので、必ず実装をしなければならない。
public void cry(){
System.out.println("bow-wow");
}
}
public class Cat extends Animal {
public Cat(String name){
super("name");
}
public void cry(){
System.out.println("mew");
}
}
import java.util.stream.Stream;
public class AnimalSimulator {
public static void main(String args[]){
// Stream<Animal>
Stream.of(new Dog("John"), new Cat("Mike"), new Dog("Pochi")).
forEach(animal -> {
// Animal型は、walk, cry2つの振る舞いを保証する。
// かつ、メソッド実行時は、それぞれの型(Dog, Cat)の実装を呼び出す。
// 型がAnimal -> Dog, Cat に変化するこの性質をポリモーフィズム(多態性と呼ぶ)
animal.walk();
animal.cry();
});
}
}
public abstract class Animal {
public final String name;
public Animal(String name){
this.name = name;
}
// 全てのアニマルは、歩く時同じ振る舞いをする(ことにしておく)
public void walk(){
System.out.println(name + " walk.");
}
// アニマル共通の鳴き声は存在しない。
// (アニマルというのは、抽象的なもの定義に過ぎず実態を持たない。)
public abstract void cry();
}