需求:
写一个类Army,代表一支军队,这个类有一个属性Weapon数组w(用来存储该军队所拥有的所有武器),该类还提供一个构造方法,在构造方法里通过传一个int类型的参数来限定该类所能拥有的最大武器数量。并用这一大小来初数化数组w。
该类还提供一个方法addWeapon(Weapon wa),表示把参数wa所代表的武器加入到数组w中。
在这个类中还定义两个方法attackAll()让数组中的所有武器攻击,
以及moveAll()让w数组中的所有可能移动的武器移动。
【提示】
Weapon是一个父类,应该有很多武器
这些子武器应该有一些是可移动的,有一些是可攻击的。
/**
* 军队
*
* 类在强制类型转换过程中,如果是类转换成接口类型。
* 那么类和接口之间不需要存在继承关系,也可以转换,
* java语法中允许。
*/
public class Army {
/**
* 武器数组
*/
private Weapon[] weapons;
/**
* 创建军队的构造方法。
* @param count 武器数量
*/
public Army(int count){
// 动态初始化数组中每一个元素默认值是null。
// 武器数组是有了,但是武器数组中没有放武器。
weapons = new Weapon[count];
}
/**
* 将武器加入数组
* @param weapon
*/
public void addWeapon(Weapon weapon) throws AddWeaponException {
for(int i = 0; i < weapons.length; i++){
//if(null == weapons[i]) {
if(weapons[i] == null) {
// 把武器添加到空的位置上。
weapons[i] = weapon;
System.out.println(weapon + ":武器添加成功");
return;
}
}
// 程序如果执行到此处说明,武器没有添加成功
throw new AddWeaponException("武器数量已达到上限!");
}
/**
* 所有可攻击的武器攻击。
*/
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();
}
}
}
}
/**
* 所有武器的父类
*/
public class Weapon {
}
/**
* 战斗机,是武器,可以移动,可攻击
*/
public class Fighter extends Weapon implements Moveable, Shootable {
@Override
public void move() {
System.out.println("战斗机起飞");
}
@Override
public void shoot() {
System.out.println("战斗机开炮!");
}
}
/**
* 高射炮,是武器,但是不能移动,只能射击
*/
public class GaoShePao extends Weapon implements Shootable {
@Override
public void shoot() {
System.out.println("高射炮开炮!!!");
}
}
/**
* 坦克是一个武器,可移动,可攻击。
*/
public class Tank extends Weapon implements Moveable,Shootable{
@Override
public void move() {
System.out.println("坦克移动");
}
@Override
public void shoot() {
System.out.println("坦克开炮");
}
}
/**
* 物资运输飞机,是武器,但是只能移动,不能攻击
*/
public class WuZiFeiJi extends Weapon implements Moveable {
@Override
public void move() {
System.out.println("运输机起飞!");
}
}
/**
* 可移动的接口
*/
public interface Moveable {
/**
* 移动行为
*/
void move();
}
/**
* 可射击的接口
*/
public interface Shootable {
/**
* 射击行为
*/
void shoot();
}
/**
* 添加武器异常。
*/
public class AddWeaponException extends Exception {
public AddWeaponException(){
}
public AddWeaponException(String s){
super(s);
}
}
public class Test {
public static void main(String[] args) {
// 构建一个军队
Army army = new Army(4); // 军队只有4个武器。
// 创建武器对象
Fighter fighter = new Fighter();
Fighter fighter2 = new Fighter();
Tank tank = new Tank();
WuZiFeiJi wuZiFeiJi = new WuZiFeiJi();
GaoShePao gaoShePao = new GaoShePao();
// 添加武器
try {
army.addWeapon(fighter);
army.addWeapon(tank);
army.addWeapon(wuZiFeiJi);
army.addWeapon(gaoShePao);
army.addWeapon(fighter2);
} catch (AddWeaponException e) {
System.out.println(e.getMessage());
}
// 让所有可移动的移动
army.moveAll();
// 让所有可攻击的攻击
army.attackAll();
// 这是new一个异常对象。没有手动抛异常,它就是一个普通的java类。
// 就像User类一样。没有区别。
/*AddWeaponException e = new AddWeaponException("武器数量已达到上限!");
System.out.println(e.getMessage());*/
}
}