编写一个小的程序,其中定义一些接口、类、抽象类,定义它们的成员(字段及方法), 要求使用使用setter/getter, static, final, abstract,@Override等语法要素,并写一个main函数来使用它们。这些类、接口可以是围绕以下选题之一
飞翔世界:来一次飞翔接力(即多个可飞翔的对象依次调用);
动物世界:来一次吃西瓜大赛;
图书馆:模拟一天的借阅过程;
学校:模拟选课过程;
等等
要求写个简要说明。
说明:对于这次作业,我想的是写一个飞行的接力比赛,具体的实行过程是这样的,分不同的组别,我这里分的是"老鹰组","大雁组","海鸥组"三个组,三个组分别来跑四百公里的接力赛,每个组有n个成员,以完成400公里的路程为主,n可以是任何整数,最后比较哪个组的n最小就是哪个组获胜,为什么说n可以是任何整数呢?因为我设置了每个成员的飞行距离是一个1到100的随机整数,所以每个组的成员是多少,是待定的。代码执行过程中会打印出每一位具体成员的飞行距离,会给出最后的比赛结果,具体代码如下:
package Fly;
public class Fly {
public static void main(String[] args) {
// TODO Auto-generated method stub
String name;
double flyrun;
String [] animal = {"老鹰组","大雁组","海鸥组"};
int [] countlist = {0,0,0};
FlyAnimal_Race a = new FlyAnimal_Race(); //赋实例a
for(int j=0;j<animal.length;j++)
{
int count = 1; //用来计算每一组使用了多少位选手
name = animal[j];
a.setName(name);
a.flyrace();
while(a.flysum<400) //设置循环直到该组完成400公里的路程
{
flyrun = (int)(Math.random()*100)+1; //加一是为了让飞行距离不为0
a.setfly_num(flyrun);
a.start(count);
count = count+1;
}
a.stop(count);
a.eat_drink();
a.flysum = 0;
countlist[j] = count-1;
}
a.result(animal,countlist); //得出结果,选出使用选手最少的组为冠军组
a.rest();
}
}
//定义接口,包含飞行竞赛和开始
interface Flyable{
public void flyrace();
public void start(int count);
public void stop(int count);
}
//定义父类动物类,包含吃、喝、休息
abstract class animal {
public void eat_drink(){};
public void rest(){};
}
//飞行类动物竞赛,继承动物父类,同时要参加接力比赛
class FlyAnimal_Race extends animal implements Flyable{
private String group; //该组别的名称
public double fly_num; //单位选手的飞行距离
public double flysum = 0; //该组的飞行总和
public static final int maxfly=101; //设置单位选手的飞行距离最大是101
public int min_group_value = 999; //设置该参数是为了寻找使用最少选手的组
public String getName(){ //获得该组别的名称
return group;
}
public void setName(String group){
this.group = group;
}
public void setfly_num(double fly_num){
if(fly_num<=maxfly)
{
this.fly_num = fly_num;
this.flysum = this.flysum + fly_num;
}else {
System.out.println("飞行距离有误");
}
}
public void result(String [] animal,int [] countlist) {
for(int i=0;i<animal.length;i++)
{
if(min_group_value>countlist[i])
{
min_group_value = countlist[i];
}
}
for(int i=0;i<animal.length;i++)
{
if(min_group_value==countlist[i])
{
System.out.println("现在宣布比赛结果:");
System.out.println("冠军是"+animal[i]+",使用了"+min_group_value+"位选手,让我们以最热烈的掌声恭喜他们获得本次比赛的冠军!!!");
}
}
}
public void flyrace(){
System.out.println(group+"开始飞行");
}
public void start(int count){
System.out.println(group+count+"号选手飞了"+fly_num+"公里");
}
public void stop(int count){
System.out.println(group+"完成比赛使用了"+(count-1)+"位选手");
}
@Override
public void eat_drink(){
System.out.println(group+"选手请到指定区域吃东西喝水补充能量,等待比赛结果。\n");
}
@Override
public void rest(){
System.out.println("接力比赛到此结束!请比赛请各组选手到指定区域休息。");
}
}
最后输出结果为:
老鹰组开始飞行
老鹰组1号选手飞了35.0公里
老鹰组2号选手飞了56.0公里
老鹰组3号选手飞了96.0公里
老鹰组4号选手飞了73.0公里
老鹰组5号选手飞了86.0公里
老鹰组6号选手飞了38.0公里
老鹰组7号选手飞了58.0公里
老鹰组完成比赛使用了7位选手
老鹰组选手请到指定区域吃东西喝水补充能量,等待比赛结果。
大雁组开始飞行
大雁组1号选手飞了9.0公里
大雁组2号选手飞了44.0公里
大雁组3号选手飞了90.0公里
大雁组4号选手飞了58.0公里
大雁组5号选手飞了52.0公里
大雁组6号选手飞了51.0公里
大雁组7号选手飞了42.0公里
大雁组8号选手飞了9.0公里
大雁组9号选手飞了39.0公里
大雁组10号选手飞了87.0公里
大雁组完成比赛使用了10位选手
大雁组选手请到指定区域吃东西喝水补充能量,等待比赛结果。
海鸥组开始飞行
海鸥组1号选手飞了78.0公里
海鸥组2号选手飞了12.0公里
海鸥组3号选手飞了29.0公里
海鸥组4号选手飞了22.0公里
海鸥组5号选手飞了79.0公里
海鸥组6号选手飞了27.0公里
海鸥组7号选手飞了91.0公里
海鸥组8号选手飞了40.0公里
海鸥组9号选手飞了17.0公里
海鸥组10号选手飞了23.0公里
海鸥组完成比赛使用了10位选手
海鸥组选手请到指定区域吃东西喝水补充能量,等待比赛结果。
现在宣布比赛结果:
冠军是老鹰组,使用了7位选手,让我们以最热烈的掌声恭喜他们获得本次比赛的冠军!!!
接力比赛到此结束!请比赛请各组选手到指定区域休息。
最后的学习知识点总结:
①@Override:通过方法的覆盖,能够修改对象的同名方法的具体实现方法
②将字段用private修饰,从而更好地将信息进行封装和隐藏。这样的话从外面就不能访问到该字段,可以使用用setXXXX和getXXXX方法对类的属性进行存取,如本例子中的group字段,可以用setName的方法给其赋值,也可以用getName的方法获得该字段。
③一个字段被static final两个修饰符所限定时,它可以表示常量,如代码中的maxfly字段。
④凡是用abstract修饰符修饰的类被称为抽象类。抽象类不能被实例化,抽象方法在子类中必须被实现,否则子类仍然是abstract的。
⑤定义接口是interface,实现接口是implements,所有在定义的接口中的方法,都必须在其子类中实现否则会报错(The type XXX must implement the inherited abstract method XXX),通常接口以able或ible结尾,表明接口能完成一定的行为。