接口与多态

本文讨论了在Java中使用接口和多态来设计软件架构的合理性,强调了继承与接口的区别。通过海洋乐园游戏的例子,解释了为何不应该让人类或潜水艇继承鱼类,而应该使用接口来表示‘游泳’这一行为。文章指出,通过接口实现多态,可以增加程序的弹性,避免过度设计,并举例说明了如何通过接口实现不同对象之间的行为共享。
摘要由CSDN通过智能技术生成

一个海洋乐园游戏,当中所有东西都会游泳。知道继承可以运用多态,定义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 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值