中小企业建站系统,360建筑网网址,廊坊做网站,网页设计师联盟qq群01.如果接到一个任务#xff0c;要求设计不同型号的悍马车 02.设计一个悍马车的抽象类#xff08;模具#xff0c;车模#xff09;
public abstract class HummerModel {/** 首先#xff0c;这个模型要能够被发动起来#xff0c;别管是手摇发动#xff0c;还是电力发动…01.如果接到一个任务要求设计不同型号的悍马车 02.设计一个悍马车的抽象类模具车模
public abstract class HummerModel {/** 首先这个模型要能够被发动起来别管是手摇发动还是电力发动反正* 是要能够发动起来那这个实现要在实现类里了*/public abstract void start(); //能发动那还要能停下来那才是真本事public abstract void stop(); //喇叭会出声音是滴滴叫还是哔哔叫public abstract void alarm(); //引擎会轰隆隆的响不响那是假的public abstract void engineBoom(); //那模型应该会跑吧别管是人推的还是电力驱动总之要会跑public abstract void run();
}
03.具体不同版本的悍马这个是抽象类的具体子类
H1 型号悍马的定义如下
public class HummerH1Model extends HummerModel { Override public void alarm() { System.out.println(悍马H1鸣笛...); } Overridepublic void engineBoom() { System.out.println(悍马H1引擎声音是这样在...); } Overridepublic void start() { System.out.println(悍马H1发动...); }Overridepublic void stop() { System.out.println(悍马H1停车...); } /** 这个方法是很有意思的它要跑那肯定要启动停止了等也就是要调其他方法*/Overridepublic void run() { //先发动汽车this.start(); //引擎开始轰鸣this.engineBoom(); //然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭this.alarm(); //到达目的地就停车this.stop(); }
} 然后看悍马 H2 型号的实现
public class HummerH2Model extends HummerModel { Overridepublic void alarm() { System.out.println(悍马H2鸣笛...); } Overridepublic void engineBoom() { System.out.println(悍马H2引擎声音是这样在...); } Overridepublic void start() { System.out.println(悍马H2发动...); } Overridepublic void stop() { System.out.println(悍马H1停车...); } /** H2要跑那肯定要启动停止了等也就是要调其他方法*/Overridepublic void run() { //先发动汽车this.start(); //引擎开始轰鸣this.engineBoom(); //然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭this.alarm(); //到达目的地就停车this.stop(); }
}
然后程序写到这里你就看到问题了run 方法的实现应该在抽象类上子类改写的都一样不应该在实现类上好我们修改一下类图和实现
就把 run 方法放到了抽象类中那代码也相应的改变一下先看 HummerModel.java:
04.修改后的抽象类
public abstract class HummerModel { /** 首先这个模型要能够被发动起来别管是手摇发动还是电力发动反正* 是要能够发动起来那这个实现要在实现类里了*/public abstract void start(); //能发动那还要能停下来那才是真本事public abstract void stop(); //喇叭会出声音是滴滴叫还是哔哔叫public abstract void alarm(); //引擎会轰隆隆的响不响那是假的public abstract void engineBoom(); //那模型应该会跑吧别管是人退的还是电力驱动总之要会跑public void run() { //先发动汽车this.start(); //引擎开始轰鸣this.engineBoom(); //然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭this.alarm(); //到达目的地就停车this.stop(); }
}05.修改后的抽象类的子类
public class HummerH1Model extends HummerModel { Override public void alarm() { System.out.println(悍马H1鸣笛...); } Overridepublic void engineBoom() { System.out.println(悍马H1引擎声音是这样在...); } Overridepublic void start() { System.out.println(悍马H1发动...); }Overridepublic void stop() { System.out.println(悍马H1停车...); } } public class HummerH2Model extends HummerModel { Overridepublic void alarm() { System.out.println(悍马H2鸣笛...); } Overridepublic void engineBoom() { System.out.println(悍马H2引擎声音是这样在...); } Overridepublic void start() { System.out.println(悍马H2发动...); } Overridepublic void stop() { System.out.println(悍马H2停车...); } }06.运行程序
public class Client { public static void main(String[] args) { //客户开着H1型号出去遛弯了HummerModel h1 new HummerH1Model(); h1.run(); //汽车跑起来了//客户开H2型号出去玩耍了HummerModel h2 new HummerH2Model(); h2.run(); }
}07.客户只要在 run 的过程中听到或看都成了呀暴露那么多的方法干啥把抽象方法保护起来 把抽象类上的四个方法设置为 protected 访问权限好了既然客户不关心这几个方法而且这四个方法都是由子类来实现的那就设置成 protected 模式。咦~那还有个缺陷run 方法既然子类都不修改那是不是可以设置成 final 类型呢是滴是滴,类图如下
public abstract class HummerModel { /** 首先这个模型要能够被发动起来别管是手摇发动还是电力发动反正* 是要能够发动起来那这个实现要在实现类里了*/protected abstract void start(); //能发动那还要能停下来那才是真本事protected abstract void stop(); //喇叭会出声音是滴滴叫还是哔哔叫protected abstract void alarm(); //引擎会轰隆隆的响不响那是假的protected abstract void engineBoom(); //那模型应该会跑吧别管是人退的还是电力驱动总之要会跑final public void run() { //先发动汽车this.start(); //引擎开始轰鸣this.engineBoom(); //然后就开始跑了跑的过程中遇到一条狗挡路就按喇叭this.alarm(); //到达目的地就停车this.stop(); }
}
大家请看这个 run 方法他定义了调用其他方法的顺序并且子类是不能修改的这个叫做模板方法start、stop、alarm、engineBoom 这四个方法是子类必须实现的而且这四个方法的修改对应了不同的类这个叫做基本方法基本方法又分为三种在抽象类中实现了的基本方法叫做具体方法在抽象类中没有实现在子类中实现了叫做抽象方法我们这四个基本方法都是抽象方法由子类来实现的还有一种叫做钩子方法 。
“客户提出新要求了那个喇叭想让它响就响你看你设计的模型车子一启动喇叭就狂响赶快修改一下”确实是设计缺陷呵呵不过是我故意的那我们怎么修改呢看修改后的类图