ababup1192
2/23/2017 - 3:12 PM

Animal.java

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();

}