Java接口回顾

今天下午被一个本科是数学系的同学询问接口,本想直接百度一下发给他,但是发现很多百科类的资料写的五花八门并不是很好理解,于是只好手动输入,顺便记录在此。
一般教材上都会把接口与抽象类放在一起讲,说明他们之间是有一定的共性的。为了方便理解,这里直接用例子来说明。
假如我们要描述愤怒的小鸟,里面有很多种不同的鸟,他们都有飞和攻击的行为,因此我们可以定义一个抽象类Bird,各种鸟都是通过弹射起飞,但是攻击的方式不同,代码如下:

public abstract class Bird {
    public void fly(){//飞
        System.out.println("弹射飞");
    }
    public abstract void attack();//攻击

然后炸弹鸟、火箭鸟就可以继承这个抽象类,代码如下:

public class RocketBird extends Bird {
    @Override
    public void attack() {
        System.out.println("加速冲撞");
    }

public class BombBird extends Bird {
    @Override
    public void attack() {
        System.out.println("炸弹攻击");
    }

上面这些都是面向对象最基本的,假如这时候,我们需要给这些鸟加一个行为–叫,该怎么加呢?如果所有的鸟都是一个叫声,那直接在抽象类Bird中添加一个shout()方法并直接实现即可。可是事实上鸟的叫声还是有一些差别的,比如喳喳叫,咕咕叫等,所以我们需要优化这个shout()方法,把它变成一个抽象方法,由继承它的子类去实现,这样确实可以起到优化作用。可是,如果鸟的子类有很多,而且有的鸟叫声都一样,那还在用抽象方法,岂不是有点啰嗦造成代码冗余了吗?这个时候就需要接口上场了。我们把叫提取成接口,代码如下:

public interface Shout {
    public void shout();
}

然后不同的叫声去实现这个接口

public class GuShout implements Shout {
    @Override
    public void shout() {
        // TODO Auto-generated method stub
        System.out.println("咕咕..");
    }
}

public class ZhaShout implements Shout {
    @Override
    public void shout() {
        // TODO Auto-generated method stub
        System.out.println("渣渣..");
    }
}

再修改抽象类,把叫的接口当作Bird的属性放入,通过构造方法来实例化接口对象,然后再实现叫的方法。修改后的代码如下:

public abstract class Bird {
    public void fly(){//飞
        System.out.println("弹射飞");
    }
    public abstract void attack();//攻击

    Shout shout;//叫的接口当作Bird的属性放入

    public Bird(Shout shout){//体现针对接口编程,不依赖于具体实现
        this.shout=shout;
    }
    public void shout(){//实现叫的方法
        shout.shout(); //调用接口对象的方法
    }   
}

子类修改如下:

public class BombBird extends Bird {
    @Override
    public void attack() {
        System.out.println("炸弹攻击");

    }
    public BombBird(Shout shout){ //通过构造方法实例化接口对象
        super(shout); //调用父类构造方法
    }
}

从上面这个例子可以看出,抽象类和接口有时候可以”同等”使用,但抽象类是对类的抽象,用于存放子类中共有的方法,而接口针对的是行为,是类的部分(行为)抽象,比如人也会叫,我们可以让鸟,人都实现叫这个接口,但是不能把鸟和人共用一个父类。我们把接口代表的行为当作属性放入,这也体现了面向对象多用组合,少用继承的原则~~这样应该清楚多了吧^ ^.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值