开放型题目,随意发挥:
写一个类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();
}
}
运行结果: