一、具体程序
抽象Meeting类
public abstract class Meeting {
//会议id
private int id;
//会议成员组别
private int member;
//会议开始时间戳
private long time;
//会议标题
private String title;
//会议备注
private String remarks;
//会议状态 -1:结束 0:待开始 1:进行中
private int state;
//会议类型 0:线下 1:线上
private int attribute;
public Meeting(int member,long time,String title,String remarks,int attribute) {
this.member=member;
this.time=time;
this.title=title;
this.remarks=remarks;
this.attribute=attribute;
this.state=0;
}
public int getid() {
return id;
}
public int getmember() {
return member;
}
public long gettime() {
return time;
}
public String gettitle() {
return title;
}
public String getremarks() {
return remarks;
}
public int getstate() {
return state;
}
public int getattribute() {
return attribute;
}
public void setId(int id) {
this.id=id;
}
public abstract void getMeeting();
public void setstate() {
this.state=-1;
}
}
线下会议类OfficialMeeting
public class OfficialMeeting extends Meeting {
private int room;
OfficialMeeting(int member,int room,int time,String title,String remarks){
super(member,time,title,remarks,0);
this.room=room;
}
public void getMeeting() {
System.out.println("会议ID:"+getid());
System.out.println("会议类型:"+getattribute());
System.out.println("会议标题:"+gettitle());
System.out.println("会议状态:"+getstate());
System.out.println("会议地点:"+room);
System.out.println("会议时间:"+gettime());
System.out.println("会议备注:"+getremarks()+"\n");
}
public int getroom() {
return room;
}
}
线上会议类OnlineMeeting
public class OnlineMeeting extends Meeting{
OnlineMeeting(int member,int time,String title,String remarks){
super(member,time,title,remarks,1);
}
public void getMeeting() {
System.out.println("会议ID:"+getid());
System.out.println("会议类型:"+getattribute());
System.out.println("会议标题:"+gettitle());
System.out.println("会议状态:"+getstate());
System.out.println("会议时间:"+gettime());
System.out.println("会议备注:"+getremarks()+"\n");
}
}
系统类Demo
public class Demo {
//抽象会议,用以统一操作
Meeting m;
//会议数组
Meeting[] arr = new Meeting[100];
//房间数组
final int[] roomarr = { 101, 102, 103, 104, 105 };
// 新增会议
public void newMeeting(Meeting m) {
int i, idmax = -1;
for (i = 0; i < arr.length; i++) {
if (arr[i] == null) {
if (i != 0)
idmax = arr[i - 1].getid();
break;
}
}
m.setId(idmax + 1);
arr[i] = m;
}
// 查询所有会议
public void showMeeting() {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null)
break;
arr[i].getMeeting();
}
}
// 查询单独会议
public void getMeeting(int id) {
System.out.println();
arr[id].getMeeting();
}
// 删除会议
public void deleteMeeting(int id) {
int j = 0;
//寻找对应id的数组下标
for (int i = j; i < arr.length; i++) {
if (arr[i] == null||arr[i].getid()==id) {
j=i;
break;
}
}
//判断改id是否为空
if (arr[j] == null) {
System.out.printf("\n未找到id为%d的会议,删除失败\n\n", id);
}
//利用覆盖,替换数组数据
for (int i = j; i < arr.length; i++) {
if (arr[i] == null) {
break;
}
arr[i] = arr[i + 1];
}
}
// 修改会议
public void modifyMeeting(int id, Meeting m) {
arr[id] = m;
arr[id].setId(id);
}
// 结束会议
public void setMeetingstate(int id) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null) {
System.out.printf("\n未找到id为%d的会议,结束失败\n\n", id);
break;
} else if (arr[i].getid() == id) {
arr[i].setstate();
break;
}
}
}
// 查询空余房间数组
public int[] getroom() {
// 已预约房间数组
int[] reservedRoom = new int[roomarr.length];
// 空余房间数组
int[] assemble = new int[roomarr.length] ;
for (int i=0;i<roomarr.length;i++) {
assemble[i]=roomarr[i];
}
//定义中间变量,用以计算数组中非零数据
int res=0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null) {
break;
}
//查询线下的房间
if (arr[i].getattribute() == 0 && arr[i].getstate()!=-1) {
OfficialMeeting official = (OfficialMeeting) arr[i];
int j = 0;
for (j = 0; j < reservedRoom.length; j++) {
if (reservedRoom[j] == 0)
break;
}
reservedRoom[j] = official.getroom();
}
}
//对比重复房间
for (int q = 0; q < reservedRoom.length; q++) {
if (reservedRoom[q]==0)
break;
for (int qq = 0; qq < roomarr.length; qq++) {
if (reservedRoom[q] == roomarr[qq])
assemble[qq] = 0;
}
}
//去零重组数组
for (int i = 0; i < assemble.length; i++) {
if(assemble[i]!=0) {
res++;
}
}
//根据数组中非零元素新建空房间数组
int freeRoom[]=new int [res];
int j=0;
for (int i = 0; i < assemble.length; i++) {
if(assemble[i]!=0) {
freeRoom[j]=assemble[i];
j++;
}
}
//返回一个数组数据
return freeRoom;
}
}
测试类Test
public class Test {
public static void main(String[] args) {
Demo d = new Demo();
//新建会议 成员组别 房间号 时间戳 标题 备注
d.newMeeting(new OfficialMeeting(1, 101, 16549854, "部门会议1", "普通会议"));
d.newMeeting(new OnlineMeeting(1, 16549854, "工作会议2", "普通会议"));
d.newMeeting(new OfficialMeeting(1, 105, 16549854, "部门会议3", "普通会议"));
d.newMeeting(new OnlineMeeting(1, 16549854, "工作会议4", "普通会议"));
// 输出会议列表
d.showMeeting();
// 按id查会议
// d.getMeeting(1);
System.out.print("空余房间");
for (int i = 0; i < d.getroom().length; i++) {
System.out.print(d.getroom()[i]+"\t");
}
// 删除某会议
d.deleteMeeting(0);
// 结束会议
d.setMeetingstate(0);
d.setMeetingstate(1);
// 输出会议列表
d.showMeeting();
System.out.print("空余房间");
for (int i = 0; i < d.getroom().length; i++) {
System.out.print(d.getroom()[i]+"\t");
}
}
}
二、复盘反思
题目:
运用所学知识编写一个“会议管理程序”
个人分析:
1.“会议管理程序”,其实就是管理会议的程序。“会议”作为程序的主体单位,编写一个对这个主体单位进行管理操作的程序。
2.作为主体的“会议”,不可能只有一种类型,其有着五花八门的类型。
3.“会议”是程序的主体单位,不是单独一个出现的,是拥有数量的,所以需要“管理”。
处理思路:
1.把“会议”与“管理”区分开来,分别进行编写。
2.“会议”是一个概念,那么我们可以用抽象类统筹这个概念,再分别对具体的分类进行编写,然后通过多态来实现我们需要的功能。
3.既然我们用类来描述“会议”,那么一个个实体的会议就是一个个对象,对 对象进行存储,我们可以使用我们的对象数组。
遇到的问题
1.对象数组的存储与读取,子类对象为什么可以存进父类对象数组里面?
2.对于方法重载与多态的一些思考。