Java案例之士兵作战功能实现

实现的功能比较简单,主要用到了多态的,抽象类以及模板方法模式这几个知识点。效果图如下,哈哈 ,大神勿喷,后面我会把这些知识点详细介绍出来,即使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(备注这个人的博客主页为啥这么好看,有知道的私聊我 谢谢)

posted @ 2017-06-07 16:15  SnailClimb  阅读(200)  评论(0编辑  收藏  举报