实现的功能比较简单,主要用到了多态的,抽象类以及模板方法模式这几个知识点。效果图如下,哈哈 ,大神勿喷,后面我会把这些知识点详细介绍出来,即使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. Gradle sync failed: Failed to find Build Tools revision 26.0.2的解决办法

    说明在android studio中没有 build tools 的26.0.2的版本,你确认一下,是否是这样: 点击==>android studio的菜单栏中Tools==>andro ...

  2. c#调用系统默认软件打开应用

    System.Diagnostics.Process.Start(),参数为对应的应用路径 System.Diagnostics.Process.Start(((FileInfo)lv.Selecte ...

  3. Visual Studio 2013中使用Ribbon For WPF

    1.首先需要 下载Ribbon For WPF.目前最新的版本是Microsoft Ribbon for WPF October 2010. 下载 链接: https://www.microsoft. ...

  4. lambda 分组练习

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<Person> per ...

  5. 【bzoj5089】最大连续子段和 分块+单调栈维护凸包

    题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...

  6. Mail.Ru Cup 2018 Round 1 virtual participate记

    因为睡过了只好vp. A:阅读理解. #include<iostream> #include<cstdio> #include<cmath> #include< ...

  7. Python正则表达式re模块

    re.compile(pattern,flags=0)将正则表达式编译成正则表达式对象.可以使用match()和search()方法进行匹配.对于常用的表达式可以先进行编译,后续可多次使用以提高效率. ...

  8. CentOS 配置无线网络,开启wifi

    背景:一台老笔记本安装CentOS7.x,最小安装模式,安装后无法开启wifi 1.先用NetworkManager包的nmcli命令检查网卡,发现无线网卡wlo1信息里有个错误plugin miss ...

  9. Oracle数据库表被锁定以及去除方式

    select t2.username, t2.sid, t2.serial#, t3.object_name, t2.OSUSER, t2.MACHINE, t2.PROGRAM, t2.LOGON_ ...

  10. BZOJ1068:[SCOI2007]压缩——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复 ...