public class SuperClass { public static void main(String[] args) { SuperClass sup=new SuperClass(); SubClass sub=new SubClass(); SuperClass supSub=new SubClass(); } } class SubClass extends SuperClass{ }
根据上述代码,判断下列选项中,赋值语句错误的是:
A. sup=sub;
B. sub=sup;
C. supSub=sub;
D. supSub=sup;
参考答案
B 选项的赋值语句是错误的。
这是因为,一个类的对象可以向上造型的类型有:父类的类型或是其实现的接口类型,而B选项将sup(SuperClass类型)直接赋值给sub(SubClass类型),属于向下造型,向下造型要使用强制类型转换,即代码改为:sub=(SubClass)sup; 来实现向下造型。
现有一个射击游戏中的场景如图- 1所示。在图- 1中有飞机、蜜蜂,这两种飞行物都可以被炮弹击中。如果击中的是敌人(即飞机),则获得5分;如果击中的是蜜蜂则获得奖励。本案例的详细需求如下:
1. 奖励有两种类型,一种奖励为双倍火力、另一种奖励为手弹。
2. 空中现有3架飞机、两只蜜蜂,判断某一炮弹能否击中它们。
图-1
参考答案
实现题目所述的射击游戏,步骤如下:
1. 定义接口Enemy表示敌人。在该接口中定义getScore方法,用于实现分数的获取。代码如下:
public class Shoot { public static void main(String[] args) { } } #cold_bold// 敌人 #cold_boldinterface Enemy { #cold_bold int getScore(); #cold_bold}
2. 定义接口Award表示奖励。在该接口中定义常量表示奖励的类型、定义getType方法用于实现获取奖励的类型。代码如下:
public class Shoot { public static void main(String[] args) { } } // 敌人 interface Enemy { int getScore(); } #cold_bold// 奖励 #cold_boldinterface Award { #cold_bold int DOUBLE_FIRE = 2;// 双倍火力 #cold_bold int BOMB = 1; // 手雷 #cold_bold #cold_bold int getType();// 获取奖励类型 返回值是整数 #cold_bold}
3. 定义抽象类FlyingObject表示飞行物。在类中定义属性 x 、y 表示飞行物所在的坐标;定义shootBy方法表示飞行物是否被击中。代码如下:
public class Shoot { public static void main(String[] args) { } } #cold_boldabstract class FlyingObject { #cold_bold int x; #cold_bold int y; #cold_bold #cold_bold abstract boolean shootBy(int x, int y); #cold_bold} #cold_bold // 敌人 interface Enemy { int getScore(); } // 奖励 interface Award { int DOUBLE_FIRE = 2;// 双倍火力 int BOMB = 1; // 手雷 int getType();// 获取奖励类型 返回值是整数 }
4. 定义类Bee表示蜜蜂。蜜蜂属于飞行物,因此Bee类继承自FlyingObject,并重写FlyingObject类的shootBy方法,根据蜜蜂被击中的规则进行重写;蜜蜂被击中后,可以获得奖励,因此,Bee类实现Award接口,并实现getType方法,获得奖励。代码如下:
public class Shoot { public static void main(String[] args) { } } #cold_bold/** 小蜜蜂 是飞行物 也是奖励 */ #cold_boldclass Bee extends FlyingObject implements Award { #cold_bold int r; #cold_bold int type; #cold_bold #cold_bold public Bee(int x, int y, int r) { #cold_bold this.x = x; #cold_bold this.y = y; #cold_bold this.r = r; #cold_bold type = Award.DOUBLE_FIRE; #cold_bold } #cold_bold #cold_bold public int getType() { #cold_bold return type; #cold_bold } #cold_bold #cold_bold public boolean shootBy(int x, int y) { #cold_bold int a = x - this.x; #cold_bold int b = y - this.y; #cold_bold return Math.sqrt(a * a + b * b) < r; #cold_bold } #cold_bold} abstract class FlyingObject { int x; int y; abstract boolean shootBy(int x, int y); } // 敌人 interface Enemy { int getScore(); } // 奖励 interface Award { int DOUBLE_FIRE = 2;// 双倍火力 int BOMB = 1; // 手雷 int getType();// 获取奖励类型 返回值是整数的 }
把蜜蜂所在的区域看出一个圆形,蜜蜂被击中的规则为:
int a = x - this.x; int b = y - this.y; return Math.sqrt(a * a + b * b) < r;
上述代码中,x 、y表示炮弹的坐标位置,this.x 、this.y表示蜜蜂的坐标位置,r表示半径。如果表达式“ Math.sqrt(a * a + b * b) < r ”的结果返回true,则蜜蜂被炮弹击中。
5. 定义类Airplane表示飞机。飞机属于飞行物,因此Airplane类继承自FlyingObject,并重写FlyingObject类的shootBy方法,根据飞机被击中的规则进行重写;飞机被击中后,可以获得分数,因此,Airplane 类实现Enemy接口,并实现 getScore方法,用于获得分数。代码如下:
public class Shoot { public static void main(String[] args) { } } #cold_bold/** 飞机是飞行物也是敌人 */ #cold_boldclass Airplane extends FlyingObject implements Enemy { #cold_bold int width; #cold_bold int height; #cold_bold #cold_bold public Airplane(int x, int y, int w, int h) { #cold_bold this.x = x; #cold_bold this.y = y; #cold_bold width = w; #cold_bold height = h; #cold_bold } #cold_bold #cold_bold public boolean shootBy(int x, int y) { #cold_bold int dx = x - this.x; #cold_bold int dy = y - this.y; #cold_bold return (dx > 0 && dx < width) && (dy > 0 && dy < height); #cold_bold } #cold_bold #cold_bold @Override #cold_bold public int getScore() { #cold_bold return 5; #cold_bold } #cold_bold} /** 小蜜蜂 是飞行物 也是奖励 */ class Bee extends FlyingObject implements Award { int r; int type; public Bee(int x, int y, int r) { this.x = x; this.y = y; this.r = r; type = Award.DOUBLE_FIRE; } public int getType() { return type; } public boolean shootBy(int x, int y) { int a = x - this.x; int b = y - this.y; return Math.sqrt(a * a + b * b) < r; } } abstract class FlyingObject { int x; int y; abstract boolean shootBy(int x, int y); } // 敌人 interface Enemy { int getScore(); } // 奖励 interface Award { int DOUBLE_FIRE = 2;// 双倍火力 int BOMB = 1; // 手雷 int getType();// 获取奖励类型 返回值是整数的 }
把飞机所在的区域看出一个矩形,飞机被击中的规则为:
int dx = x - this.x; int dy = y - this.y; return (dx > 0 && dx < width) && (dy > 0 && dy < height);
上述代码中,x 、y表示炮弹的坐标位置,this.x 、this.y表示飞机的坐标位置,width、height表示矩形的宽和高。如果表达式“(dx > 0 && dx < width) && (dy > 0 && dy < height) ”的结果返回true,则飞机被炮弹击中。
6. 在main方法中,首先,构造长度为5的FlyingObject类型的数组,将3架飞机和两只蜜蜂作为数组的元素; 然后,设置炮弹的坐标位置;最后,循环判断数组中的飞行物是否被击中,如果被击中,则再判断是蜜蜂还是飞机,如果是飞机,则输出得分,如果是蜜蜂则输出奖励类型。代码如下:
public class Shoot { public static void main(String[] args) { #cold_bold FlyingObject[] objects = new FlyingObject[5]; #cold_bold objects[0] = new Airplane(103, 68, 20, 20); #cold_bold objects[1] = new Airplane(243, 102, 20, 20); #cold_bold objects[2] = new Airplane(153, 166, 20, 20); #cold_bold objects[3] = new Bee(85, 256, 20); #cold_bold objects[4] = new Bee(256, 287, 20); #cold_bold int x = 82; #cold_bold int y = 253; #cold_bold for (int i = 0; i < objects.length; i++) { #cold_bold FlyingObject obj = objects[i]; #cold_bold if (obj.shootBy(x, y)) { #cold_bold if (obj instanceof Enemy) { #cold_bold Enemy enemy = (Enemy) obj; #cold_bold System.out.println("加分:" + enemy.getScore()); #cold_bold } #cold_bold if (obj instanceof Award) { #cold_bold Award award = (Award) obj; #cold_bold System.out.println("奖励" + award.getType()); #cold_bold } #cold_bold } #cold_bold } } } /** 飞机是飞行物也是敌人 */ class Airplane extends FlyingObject implements Enemy { int width; int height; public Airplane(int x, int y, int w, int h) { this.x = x; this.y = y; width = w; height = h; } public boolean shootBy(int x, int y) { int dx = x - this.x; int dy = y - this.y; return (dx > 0 && dx < width) && (dy > 0 && dy < height); } @Override public int getScore() { return 5; } } /** 小蜜蜂 是飞行物 也是奖励 */ class Bee extends FlyingObject implements Award { int r; int type; public Bee(int x, int y, int r) { this.x = x; this.y = y; this.r = r; type = Award.DOUBLE_FIRE; } public int getType() { return type; } public boolean shootBy(int x, int y) { int a = x - this.x; int b = y - this.y; return Math.sqrt(a * a + b * b) < r; } } abstract class FlyingObject { int x; int y; abstract boolean shootBy(int x, int y); } // 敌人 interface Enemy { int getScore(); } // 奖励 interface Award { int DOUBLE_FIRE = 2;// 双倍火力 int BOMB = 1; // 手雷 int getType();// 获取奖励类型 返回值是整数的 }
本案例的完整代码如下所示:
public class Shoot { public static void main(String[] args) { FlyingObject[] objects = new FlyingObject[5]; objects[0] = new Airplane(103, 68, 20, 20); objects[1] = new Airplane(243, 102, 20, 20); objects[2] = new Airplane(153, 166, 20, 20); objects[3] = new Bee(85, 256, 20); objects[4] = new Bee(256, 287, 20); int x = 82; int y = 253; for (int i = 0; i < objects.length; i++) { FlyingObject obj = objects[i]; if (obj.shootBy(x, y)) { if (obj instanceof Enemy) { Enemy enemy = (Enemy) obj; System.out.println("加分:" + enemy.getScore()); } if (obj instanceof Award) { Award award = (Award) obj; System.out.println("奖励" + award.getType()); } } } } } /** 飞机是飞行物也是敌人 */ class Airplane extends FlyingObject implements Enemy { int width; int height; public Airplane(int x, int y, int w, int h) { this.x = x; this.y = y; width = w; height = h; } public boolean shootBy(int x, int y) { int dx = x - this.x; int dy = y - this.y; return (dx > 0 && dx < width) && (dy > 0 && dy < height); } @Override public int getScore() { return 5; } } /** 小蜜蜂 是飞行物 也是奖励 */ class Bee extends FlyingObject implements Award { int r; int type; public Bee(int x, int y, int r) { this.x = x; this.y = y; this.r = r; type = Award.DOUBLE_FIRE; } public int getType() { return type; } public boolean shootBy(int x, int y) { int a = x - this.x; int b = y - this.y; return Math.sqrt(a * a + b * b) < r; } } abstract class FlyingObject { int x; int y; abstract boolean shootBy(int x, int y); } // 敌人 interface Enemy { int getScore(); } // 奖励 interface Award { int DOUBLE_FIRE = 2;// 双倍火力 int BOMB = 1; // 手雷 int getType();// 获取奖励类型 返回值是整数 }