实现的功能比较简单,主要用到了多态的,抽象类以及模板方法模式这几个知识点。效果图如下,哈哈 ,大神勿喷,后面我会把这些知识点详细介绍出来,即使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. phpcms免登录cookies设置方案

    PHPCMS的SESSION时间长一些的解决办法修改两个文件: phpsso_server/caches/configs/system.php里的 'session_ttl' => 999999 ...

  2. PHP中如何使用Redis接管文件存储Session详解

    https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...

  3. %pylab ipython 中文

    格式:%pylab [--no-import-all] [gui] 该命令会在ipython或notebook环境中自动加载numpy和matplotlib库,跟以下语句功能一致 import num ...

  4. (五)Redis集合Set操作

    Set全部命令如下: sadd key member1 member2 ... # 将一个或多个member元素加入到集合key中,已经存在于集合的member元素将被忽略 spop key # 移除 ...

  5. ictclas4j 分词工具包 安装流程

    首先把 ictclasj解压缩,然后 1.把 Data文件夹整个拷贝到 Eclipse项目的文件夹下, 2.而 bin目录下的 org文件夹整个拷贝到你 Eclipse项目的 bin目录下,(将cla ...

  6. 【题解】Uoj79一般图最大匹配

    带花树裸题,感觉带花树强强……不会的勿看此文,解释的可能不对,只是给自己看的!!!如题,带花树即为求一般图最大匹配算法(匈牙利与dinic为二分图最大匹配).推荐论文:2015年<浅谈图的匹配算 ...

  7. [NOIP2017]逛公园 最短路图 拓扑序DP

    ---题面--- 题解: 挺好的一道题. 首先我们将所有边反向,跑出n到每个点的最短路,然后f[i][j]表示从i号节点出发,路径长比最短路大j的方案数. 观察到,如果图中出现了0环,那么我们可以通过 ...

  8. 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告

    [USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...

  9. bzoj3232圈地游戏——0/1分数规划+差分建模+判环

    Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到 ...

  10. responseBody注解可以直接返回字符串 && springMVC Controller get请求返回字符串是中文乱码解决

    //获取商品描述信息(html片段)字符串返回给前台填充html @RequestMapping(value="/item/desc/{itemId}",produces=Medi ...