您的位置:首页 > 编程语言 > Java开发

抽象类与抽象方法的使用

2016-11-28 20:45 435 查看
学了这么长时间的抽象类与抽象方法,只是看别人这么设计,这么写。现在终于在项目中实际使用了。下面抽象出来,阐述下。

在现有的系统下,已经有了下面的实现:

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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息