抽象类的最大特点在于强制规定了子类的实现结构,那么除了这一特点之外,抽象类更多的情况下还饿可以起到一个模板的作用。
下面做个简单的分析
人=吃饭+工作+睡觉;
猪=吃饭+睡觉;
机器人=吃饭+工作。
那么现在假设有一个按钮控制command(方法),一旦传入二兰某些指令之后就可以进行相应的处理。
abstract class Action{//描述的是一个抽象的行为
public static final int EAT=1;
public static final int SLEEP=5;
public static final int WORK=10;
public void command(int cmd) {
switch(cmd) {
case EAT:
this.eat();
break;
case SLEEP:
this.sleep();
break;
case WORK:
this.work();
break;
case EAT+SLEEP+WORK:
this.eat();
this.sleep();
this.work();
break;
}
}
//不确定具体的实现,但是行为应该定义好
public abstract void eat();
public abstract void sleep();
public abstract void work();
}
public class TestDemo {
public static void main(String[] args) {
}
}
范例:定义各个行为的子类
abstract class Action{//描述的是一个抽象的行为
public static final int EAT=1;
public static final int SLEEP=5;
public static final int WORK=10;
public void command(int cmd) {
switch(cmd) {
case EAT:
this.eat();
break;
case SLEEP:
this.sleep();
break;
case WORK:
this.work();
break;
case EAT+SLEEP+WORK:
this.eat();this.sleep();this.work();
break;
}
}
public abstract void eat();
public abstract void sleep();
public abstract void work();
}
class Human extends Action{
public void eat() {System.out.println("在凳子上吃饭");}
public void sleep() {System.out.println("在床上吃饭");}
public void work() {System.out.println("努力奋斗");}
}
class Pig extends Action{
public void eat() {System.out.println("在槽里吃");}
public void sleep() {System.out.println("原地睡");}
public void work() {}
}
class Robot extends Action{
public void eat() {System.out.println("补充能量");}
public void sleep() {}
public void work() {System.out.println("机器人不停工作");}
}
public class TestDemo {
public static void main(String[] args) {
}
}
范例:调用各自的行为操作
public class TestDemo {
public static void main(String[] args) {
fun(new Human());//抽象类的使用必须要通过子类进行对象实例化
fun(new Pig());
fun(new Robot());
}
public static void fun(Action action) {
action.command(action.EAT+action.SLEEP+action.WORK);
}
}
实际上通过此程序定义的结构你可以清楚的发现一个问题:
|~如果抽象类在实际的使用过程之中会定义一些固化的模式了
(上面的command()方法按钮),它只能接受几种特定的指示
|~但是每种指令的具体实现由子类负责完成,父类只做了方法的约定。
最具有代表是的就是后面要学习的Servlet
1.抽象类虽然定义了子类必须要做的事情,但是抽象类依然会存在会有单继承局限。
2.抽象类的使用必须要通过子类进行对象实例化