实现的功能比较简单,主要用到了多态的,抽象类以及模板方法模式这几个知识点。效果图如下,哈哈 ,大神勿喷,后面我会把这些知识点详细介绍出来,即使Java学的不好,只要有一点其他语言基础或者没有应该都能看懂了。对于初学Java的人帮助应该蛮大的。嘿嘿。

先上效果图:



源代码:

Soldier.java

public abstract class Soldier {
private String name;
public Soldier(String name){
this.name=name;
}
public String getName() {
return name;
}
public void start(){
System.out.println("准备攻击···");
}
public void end(){
System.out.println("攻击完成了···");
}
public abstract void attack();//每种兵种的攻击方式不同所以设置成抽象类
public void action() {
start();
attack();//调该方法时根据子类的种类调用相应的方法
end(); }

LandSoldier.java

public class LandSoldier extends Soldier{
public LandSoldier(String name) {
// TODO Auto-generated method stub
super(name);
}
@Override
public void attack() {
// TODO Auto-generated method stub
//这个方法是必须实现的因为在父类中这个方法是抽象类
System.out.println(getName()+"使用步枪攻击");;
} }

OceanSoldier.java

public class OceanSoldier extends Soldier {
public OceanSoldier(String name) {
// TODO Auto-generated method stub
super(name);
}
@Override
public void attack() {
// TODO Auto-generated method stub
//这个方法是必须实现的因为在父类中这个方法是抽象类
System.out.println(getName()+"使用鱼雷攻击");;
} }

Officer.java


public class Officer extends Soldier { private Soldier[] soldiers=new Soldier[2];//军官持有两个士兵
public Officer(String name) {
super(name);
// TODO Auto-generated constructor stub
soldiers[0]=new LandSoldier("皮皮陆军");
soldiers[1]=new OceanSoldier("皮皮海军");
}
public Soldier[] getSoldiers(){
return soldiers;
} @Override
public void attack() {
// TODO Auto-generated method stub
//抽象类的抽象方法必须实现
System.out.println(getName()+"使用手枪攻击");
}
//发号司令,让自己的士兵一起发动攻击
public void callToAttack(){
for (int i = 0; i < soldiers.length; i++) {
soldiers[i].action();
}
this.action();//自己发动攻击
}
//让一个士兵去攻击
public void callToAttackOne(Soldier soldier){
soldier.attack();
} }

Txt.java

public class Txt {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Officer officer=new Officer("皮皮警官");
officer.callToAttack();
System.out.println("****************");
officer.callToAttackOne(officer);//指定警官发动攻击
officer.callToAttackOne(officer.getSoldiers()[0]);//指定陆军发动攻击
officer.callToAttackOne(officer.getSoldiers()[1]);//指定海军发动攻击
} }

哈哈,代码不多,自己敲一敲,不要复制粘贴哦,监督着你呢!

下面来说用到的知识点:

(1)抽象类以及抽象方法

  在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

abstract void 方法名();本例中的抽象方法就是public abstract void attack();

  抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。简单的来说,抽象类生来就是当爸爸(父类)的,因为它就就是为别的类继承自己而生。另外抽象类中的抽象方法子类继承后必须实现。

 本例中因为每个类都一个攻击方法,每个类都有并且不一样,所以考虑的抽象方法。

关于抽象类的更多讲解参考博客:http://blog.csdn.net/chenssy/article/details/12858267

(2)多态

所谓多态就是一个对象变现出来的不同形式,如本例中声明了两个soldier引用分别指向了陆军和海军变量,通过soldier应用调用attack方法时会出现不一样的表现形式。

关于多态的具体知识请参考:

http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html

http://www.jb51.net/article/34413.htm

(3)模板方法

模板方法说简单点就是把通过一些一个函数把对象需要执行的其他函数放在里面的方法,这个在我印象中使用在抽象类中的比较多,就如本例军人攻击之前需要准备(第1个方法)然后攻击的方式不一样(第2个方法同时也是抽象方法从而引出这个类是抽象类)最后就是攻击结束(第3个方法)。如果想深入了解参考下面几篇文章:

http://blog.csdn.net/zhangliangzi/article/details/51475133

http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html

(4)对象数组

通过类创建的数组。本例中:

private Soldier[] soldiers=new Soldier[2];//创建Soldier对象数组保存军官持有两个士兵

参考文档:http://www.cnblogs.com/jsjlxgf/p/6143544.html(备注这个人的博客主页为啥这么好看,有知道的私聊我 谢谢)

Java案例之士兵作战功能实现的更多相关文章

  1. Java案例之随机验证码功能实现

    实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的 ...

  2. _00019 Storm架构介绍和Storm获取案例(简单的官方网站Java案例)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  3. JAVA实现双向链表的增删功能

    JAVA实现双向链表的增删功能,完整代码 package linked; class LinkedTable{ } public class LinkedTableTest { //构造单链表 sta ...

  4. java实现循环链表的增删功能

    java实现循环链表的增删功能,完整代码 package songyan.test.demo; public class Demo { // java 实现循环链表 public static voi ...

  5. Atitit php java python nodejs错误日志功能的比较

    Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...

  6. Fastjson是一个Java语言编写的高性能功能完善的JSON库。

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  7. java实现网站paypal支付功能并且异步修改订单的状态

    java实现网站paypal支付功能并且异步修改订单的状态:步骤如下 第一步:去paypal的官网https://www.paypal.com注册一个个人账号,在创建沙箱测试账号时需要用到 第二步:p ...

  8. Java实现在线预览功能

    java实现在线预览功能,需要用到  jacob.dll jacob.jar   预览pdf所需js  pdfobject.min.js 将上传文件转为pdf保存. <div class=&qu ...

  9. 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...

随机推荐

  1. InstallShield Limited Edition for Visual Studio 国内注册时国家无下拉框解决方法

    注册地址:http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio 火狐 ...

  2. 使用js 复制 文字到剪贴板

    有一个好插件 https://clipboardjs.com/ 兼容性  IE9+ 一般基本够用,但如果非要兼容IE8 可使用IE 特有的 方法 window.clipboardData.setDat ...

  3. table 标签 语法

  4. 关于__name__=='__main__

    if __name__=='__main__' :  为了区分你是主动执行这个脚本,还是从别的地方把它当做一个模块去调用. 如果是主动执行,则执行.如果是调用的,则不执行主体. 里面存放的可能是一些测 ...

  5. [CF1095F]Make It Connected

    题目大意:给你$n(n\leqslant2\times10^5)$个点和$m(m\leqslant2\times10^5)$条边,第$i$个点点权为$a_i$.连接$u,v$两个点的代价为$a_u+a ...

  6. [JXOI2017]颜色 线段树扫描线 + 单调栈

    ---题面--- 题解: 首先题目要求删除一些颜色,换个说法就是要求保留一些颜色,那么观察到,如果我们设ll[i]和rr[i]分别表示颜色i出现的最左边的那个点和最右边的那个点,那么题目就是在要求我们 ...

  7. [USACO06NOV]玉米田Corn Fields 状压DP

    题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...

  8. Vue推荐资料

    推荐博文(我是看过,才敢说的偶): 基础教学: 菜鸟语法教程:https://cn.vuejs.org/v2/guide/syntax.html  http://www.runoob.com/vue2 ...

  9. Cydia Substrate based DexDumper's weakness

    得益于Cydia Substrate框架,HOOK Native函数变得简单,也给脱壳带来方便. 像ijiami免费版,360,classes.dex被加密到so文件并运行时释放到内存,因此针对相关函 ...

  10. angularJS前端分页插件

    首先在项目中引入 分页插件的 js 和 css: 在html页面引入 相关js 和 css: 在控制器中引入分页插件中定义的 module[可以打开pagination.js查看,可以看到 其实,在插 ...