一个海洋乐园游戏,当中所有东西都会游泳。知道继承可以运用多态,定义fish类,类中有个swim()的行为:
package hello;
public abstract class Fish {
protected String name;
public Fish(String name) {
this.name=name;
}
public String getName() {
return name;
}
public abstract void swim();
}
由于实际上每种鱼游泳方式不同,所以将swim()定义为 abstract,因此Fish也是abstract。接着定义鲨鱼继承鱼
public class Shark extends Fish{
public Shark(String name) {
super(name);
}
@Override
public void swim() {
System.out.printf("鲨鱼%s 游泳%n",name);
}
}
鲨鱼 Shark类继承了Fish,并操作swim()方法,也许你还定义了食人鱼等等。人也会游泳啊,于是就再定义Huma类继承Fish。Human继承Fish?不会觉得很奇怪吗?就目前为止,程序也可以执行,继承会有是一种(is-a)的关系,所以 Anemonefish是一种fish, Shark是一种Fish. Piranha是一种Fish,如果你让 Human继承Fish,那 Human是一种Fish?
程序上可以通过编译也可以执行,但逻辑上或设计上有不合理的地方,你可以继续硬掰下去,如果现在加个潜水艇呢?写个 submarine继承Fish吗? Submarine是一种Fish吗?继续这样的想法设计下去,你的程序架构会越来越不合理,越来越没有弹性。Java中只能继承一个父类,所以更强化了“是一种”关系的限制性。如果把海洋乐园变为海空乐园,有的东西会游泳,有的东西会飞,有的东西会游也会飞,如果用继承方式来解决,写个Fish让会游的东西继承,写个Bird让会飞的东西继承,那会游也会飞的怎么办?
“所有东西”都会“游泳”,代表了“游泳”这个“行为”可以被所有东西拥有,而不是“某种”东西专属。对于“定义行为”,在Java中可以使用
interface关键字定义 :
package hello;
public interface Swimmer {
public abstract void swim();
}
以上程序代码定义了 Swimmer接口,接口可以用于定义行为但不定义操作,在这里 Swimmer中的swim()方法没有操作,直接标示为abstract,而且一定是 public。对象若想拥有 Swimmer定义的行为,就必须操作 Swimmer接口。例如,Fish拥有 Swimmer行为:
package hello;
public abstract <