数组作业
问题描述:
写一个类Army,代表一支军队,这个类有一个属性Weapon数组w(用来存储该军队的所有武器)该类还提供一个构造方法,在构造方法里传一个int类型参数来限定该类所能拥有的的最大武器数量,并用这一大小来初始化数组w该类还提供一个方法addWeapon(Weapon wa),表示把参数wa所代表的武器加入到数组w中。该类还有两个方法attackAll()让数组中的所有武器攻击;以及moveAll()让w数组中的所有武器移动。提示:Weapon是一个父类。应该有很多子武器,这些子武器有一些是可以攻击的,有一些是可移动的
实现:
package i数组作业武器数组;
/*
* 该类中不应该写移动和攻击的方法,这些方法应该写在接口中,让子类具体武器去实现
*/
public class Weapon {
}
package i数组作业武器数组;
/*
* 武器已填满异常
*/
public class WeaponIndexOutOfBoundsException extends Exception{
public WeaponIndexOutOfBoundsException() {
// TODO 自动生成的构造函数存根
}
public WeaponIndexOutOfBoundsException(String s) {
// TODO 自动生成的构造函数存根
super(s);
}
}
package i数组作业武器数组;
/*
* 移动接口
*/
public interface Moveable {
//移动行为
void move();
}
package i数组作业武器数组;
/*
* 射击接口
*/
public interface Shootable {
//射击行为
void shoot();
}
package i数组作业武器数组;
/*
* 战斗机是武器,可移动可发射
*/
public class Fighter extends Weapon implements Moveable,Shootable{
@Override
public void move() {
// TODO 自动生成的方法存根
System.out.println("战斗机急速飞行");
}
@Override
public void shoot() {
// TODO 自动生成的方法存根
System.out.println("战斗机发射高柳炮弹");
}
}
package i数组作业武器数组;
/*
* 高射炮是武器,能发射但不能移动
*/
public class GaoShePao extends Weapon implements Shootable {
@Override
public void shoot() {
// TODO 自动生成的方法存根
System.out.println("高射炮发炮");
}
}
package i数组作业武器数组;
/*
* 运输机是武器,能移动不能射击
*/
public class YunShuJi extends Weapon implements Moveable{
@Override
public void move() {
// TODO 自动生成的方法存根
System.out.println("运输机转移基地");
}
}
package i数组作业武器数组;
/*
* 坦克是武器,能发射也能移动
*/
public class Tank extends Weapon implements Moveable,Shootable{
@Override
public void move() {
// TODO 自动生成的方法存根
System.out.println("坦克出动");
}
@Override
public void shoot() {
// TODO 自动生成的方法存根
System.out.println("坦克发动炮击");
}
}
package i数组作业武器数组;
/*
* 军队
*/
public class Army {
/*
* 军队的一个属性,武器,有多种,以数组形式存在
*/
private Weapon[] weapons;
/*
* 无参数的构建军队构造方法
*/
public Army() {
// TODO 自动生成的构造函数存根
}
/**
*
* @param count 武器数量
*/
public Army(int count) {
// TODO 自动生成的构造函数存根
//动态初始化数组中每一个元素默认值为null
weapons = new Weapon[count];
}
/**
* 将武器加入数组
* @param weapon
* @throws WeaponIndexOutOfBoundsException
*/
public void addWeapon(Weapon weapon) throws WeaponIndexOutOfBoundsException {
for (int i = 0; i < weapons.length; i++) {
if (null == weapons[i]) {
weapons[i] = weapon;
return;
}
}
//如果程序执行到这说明武器没有添加成功,抛个异常,而且放在for循环外面
throw new WeaponIndexOutOfBoundsException("武器以达到上限");
}
/**
* 让所有可攻击的武器攻击
*/
public void attackAll() {
for (int i = 0; i < weapons.length; i++) {
if (weapons[i] instanceof Shootable) {
//调用子类中的特有方法,向下转型
Shootable shootable = (Shootable)weapons[i];
shootable.shoot();
}
}
}
/**
* 让所有可移动的武器移动
*/
public void moveAll() {
for (int i = 0; i < weapons.length; i++) {
if (weapons[i] instanceof Moveable) {
//调用子类中的特有方法,向下转型
Moveable moveable = (Moveable)weapons[i];
moveable.move();
}
}
}
}
package i数组作业武器数组;
public class Test {
public static void main(String[] args) {
//创建军队
Army army = new Army(4);
//创建各式武器
Weapon tank = new Tank();
Weapon fighter = new Fighter();
Weapon gaoshepao = new GaoShePao();
Weapon yunshuji = new YunShuJi();
//将武器放进军队的武器库数组中
try {
army.addWeapon(tank);
army.addWeapon(fighter);
army.addWeapon(gaoshepao);
army.addWeapon(yunshuji);
army.addWeapon(yunshuji);
} catch (WeaponIndexOutOfBoundsException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//使所有能移动的武器移动
army.moveAll();
System.out.println("=============================");
//使所有能攻击的武器攻击
army.attackAll();
}
}