抽象类与抽象方法的使用

学了这么长时间的抽象类与抽象方法,只是看别人这么设计,这么写。现在终于在项目中实际使用了。下面抽象出来,阐述下。
在现有的系统下,已经有了下面的实现:

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public interface Animal {
    void doEat();
}

假设这个食草动物,每次eat之前都要洗手、盛饭,吃完之后都要洗碗。

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public class GrassAnimal implements Animal {
    @Override
    public void doEat() {
        //洗手
        //盛饭
        System.out.println("eat grass!");
        //洗碗
    }
}

当然应用的时候自然是:

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public class Main {
    public static void main(String[] args) {
        Animal grassAnimal = new GrassAnimal();
        grassAnimal.doEat();
    }
}

这种设计是没有任何问题的。但是,在工程后面的迭代过程中,可能出现了一种肉食动物,他们也eat,他们在吃饭之前也要洗手、盛饭,吃完饭也要洗碗,怎么办?难道像下面这样实现?

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public class MeatAnimal implements Animal {
    @Override
    public void doEat() {
        //洗手
        //盛饭
        System.out.println("eat meat!");
        //洗碗
    }
}

如果你没有发现这里有很多冗余代码的话(当然这里比较简单,如果在实际项目中,代码要复杂的多,你可能真的无法发现这些冗余),而你恰巧使用的是IDEA工具,这时IDEA会给你冗余的代码划很多波浪线,提示这些是冗余的代码。怎么办?怎么去除这些冗余呢?但是他们吃的确实不一样啊?一个吃草,一个吃肉?
这样抽象类和抽象方法就应运而生了。请看实现:
Animal.java

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public interface Animal {
    void doEat();
}

AbstractAnimal.java

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public abstract class AbstractAnimal implements Animal {
    public void doEat() {
        //洗手
        //盛饭
        eat();
        //洗碗
    }

    public abstract void eat();
}

GrassAnimal.java

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public class GrassAnimal extends AbstractAnimal {
    @Override
    public void eat() {
        System.out.println("eat grass!");
    }
}

MeatAnimal.java

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public class MeatAnimal extends AbstractAnimal {
    @Override
    public void eat() {
        System.out.println("eat meat!");
    }
}

Main.java

package org.fan.animal;

/**
 * Created by fan on 2016/11/28.
 */
public class Main {
    public static void main(String[] args) {
        Animal meatAnimal = new MeatAnimal();
        Animal grassAnimal = new GrassAnimal();
        meatAnimal.doEat();
        grassAnimal.doEat();
    }
}

输出结果如下:

eat meat!
eat grass!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值