武器作业详解 (综合:面向对象、数组、异常、接口、多态)

开放型题目,随意发挥:

写一个类Army,代表一支军队,这个类有一个属性Weapon数组w (用来存储该军队所拥有的所有武器),
该类还是供一个构造方法,在构造方法里通过传一个int类型的参数来限定该类所能拥有的最大武器数量,
    并用这一大小来初始化数组w

该类还提供一个方法addWeapon(Weapon wa) 【添加武器】,表示把参数wa所代表的武器加入到数组w中。
在这个类中还定义两个方法attackAll()让w数组中的所有武器攻击:
以及moveAll()让w数组中的所有可移动的武器移动。

写一个主方法去测试以上程序。 
提示:
    Weapon(武器)是一个父类。应该有很多子武器【继承父类武器】。
    这些子武器应该有一些是可移动的,有一些
    是可攻击的。【可写成接口】
 

代码演示如下:

1、创建可射击接口:

package com.bjpowernode.javase.exception.homework1;

//  可射击接口
public interface ShootAble{
    // 设计的方法
    void shoot();
}

2、创建可移动接口:

package com.bjpowernode.javase.exception.homework1;

// 可移动的接口
public interface MoveAble {
    // 移动的方法
    void move();
}

3、创建父类(武器)

package com.bjpowernode.javase.exception.homework1;

// 武器父类
/*
    因为军队当中是以Weapon为数组类型的 不以Weapon为数组的话 存放的武器太过于单一 比如以Tank[] tank;为数组的话 往
    数组里面添加的武器只能是坦克   但是我们以武器的父类Weapon为数组的话 让Tank、GaoShePao.....子类继承后,往父类数组当中
    可以传入子类的武器(多态)
 */
public class Weapon {

    // 重写toString方法
    // 不会~
}

4、创建高射炮武器

package com.bjpowernode.javase.exception.homework1;

// 高射炮是武器,但是不能移动,可以射击
public class GaoShePao extends Weapon implements ShootAble{
    @Override
    public void shoot() {
        System.out.println("高射炮开炮");
    }
}

5、创建物质车武器

package com.bjpowernode.javase.exception.homework1;

// 物质车是武器,能移动 但不能射击
public class WuZiChe extends Weapon implements MoveAble {
    @Override
    public void move() {
        System.out.println("物资车移动");
    }
}

6、创建坦克武器

package com.bjpowernode.javase.exception.homework1;

// 坦克是一个武器,可射击可移动
public class Tank extends Weapon implements MoveAble,ShootAble{

    // 重写接口当中的移动和射击方法
    @Override
    public void move() {
        System.out.println("坦克移动");
    }

    @Override
    public void shoot() {
        System.out.println("坦克射击");
    }
}

7、创建异常类:

package com.bjpowernode.javase.exception.homework1;

// 创建异常类
public class WeaponException extends Exception{

    public WeaponException() {
    }

    public WeaponException(String message) {
        super(message);
    }
}

8、军队类:

package com.bjpowernode.javase.exception.homework1;
// 军队
public class Army {
    // 存储所有武器数量
    private Weapon [] weapons;   // 默认初始值为null

    // 构造方法
    public Army(int count) {    // 初始武器数量
        weapons =new Weapon[count];
    }
    // 添加武器
    public void addWeapon(Weapon weapon) throws WeaponException {
        // for循环遍历数组
        for (int i=0;i<weapons.length;i++){
            // 当数组里面为null时,说明数组里面没有武器 可以进行添加
            if (weapons[i] ==null){ // 当下标对应的元素为null时 说明此处没有武器
                weapons[i] =weapon; // 添加武器
                System.out.println("武器:"+weapon+"添加成功 rush B~");    // 输出引用会调用toString方法 Weapon类当中没有重写toString方法 输出结果:内存地址.类名
                return;

            }
        }
        // 代码能执行到这里 说明数组已满 武器添加失败
        throw new WeaponException("军队中的武器已经够用了 添加失败~");

    }

    // 攻击武器进行攻击方法
    public void attackAll(){
        /*
        对数组进行遍历
        for (int i =0; i<weapons.length;i++){
            // 拿坦克当中的攻击方法
            if (weapons[i] instanceof Tank){
                Tank t =(Tank)weapons[i];
                t.Shoot();
            }
            // 发现不运用接口的话 只能拿出特定的武器的攻击方法,比如只能拿到坦克但是高射炮也会攻击,我们这里的代码只能拿到坦克的
            // 运用接口 可以让有攻击方法的类实现(继承)该接口 然后调用该接口中的攻击方法的时候,实现该接口只要重写攻击方法的类都可以遍历拿到
        }
         */

        // 对数组进行遍历
        for (int i=0; i< weapons.length;i++){
            // 判断取出来的数组中武器的对象是否有攻击方法
            if (weapons[i] instanceof ShootAble){   // 假设weapons[i]取出来一个Tank对象, Tank类实现了ShootAble接口类 所以可以instanceof判断该对象是否指向ShootAble
                // 是的话就强转一下 然后调用Shoot方法即可进行射击
                ShootAble s =(ShootAble)weapons[i]; // 向上转型
                s.Shoot();
            }
        }
    }

    // 可移动的武器进行移动
    public void moveAll(){
        // 同上一样
        for (int j=0;j< weapons.length;j++){
            if (weapons[j] instanceof MoveAble){
                MoveAble m =(MoveAble)weapons[j];
                m.move();
            }
        }

    }



    // setter and getter
    public Weapon[] getWeapons() {
        return weapons;
    }

    public void setWeapons(Weapon[] weapons) {
        this.weapons = weapons;
    }
}

9、代码测试:

package com.bjpowernode.javase.exception.homework1;

// 代码测试
public class ArmyTest {
    public static void main(String[] args) {
        // 创建武器总量
        Army army =new Army(5);

        // 创建坦克武器
        Tank tank =new Tank();
        // 创建高射炮武器
        GaoShePao gaoShePao =new GaoShePao();
        // 创建物资车武器
        WuZiChe wuZiChe =new WuZiChe();

        // 将武器添加到军队当中
        try {
            army.addWeapon(tank);
            army.addWeapon(gaoShePao);
            army.addWeapon(wuZiChe);
            army.addWeapon(wuZiChe);
            army.addWeapon(wuZiChe);
            army.addWeapon(wuZiChe);
        } catch (WeaponException e) {
            e.printStackTrace();
        }

        // 让军队可移动的武器移动
        army.moveAll();
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值