📄 movie.java
字号:
package chap5.videostore.version2;
import java.util.Date;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
public class Movie {
//电影名称
String title;
//发行时间
Date issueTime;
//导演
String director;
//存放商店拥有的该电影的所有影碟对象,cdList是一个数组列表,可以包含其它对象
ArrayList<CD> cdList =new ArrayList<CD>();
/**
* @param vcdnum 商店定购的该部电影VCD的碟片数量
* */
public Movie( String title,String director, Date issueTime,int vcdnum,int dvdnum) {
this.director = director;
this.issueTime = issueTime;
this.title = title;
//初始化该部电影的碟片对象,并通通放进cdList集合对象中
CD cd=null;
int i;
int j=0;
for(i=0;i<vcdnum;i++,j++){
/*
* 为了模拟出租和销售的业务,这里随机的创建一些供出租和销售的碟子
* 请同学们注意父类类型对子类对象的声明
*/
if(i%5==0){
cd=new RentCD(this.title+"-"+j,"VCD",3,this);
}else{
cd=new SailCD(this.title+"-"+j,"VCD",3,this);
}
cdList.add(cd);//将生成的CD对象放进集合对象cdList中管理起来
}
for(i=0 ;i<dvdnum;i++,j++){
if(i%5==0){
cd=new RentCD(this.title+"-"+j,"DVD",4,this);
}else{
cd=new SailCD(this.title+"-"+j,"DVD",4,this);
}
cdList.add(cd);
}
}
/**
* 列出该电影所有的cd对象信息
* */
public void listCD(){
for(CD cd:cdList){
System.out.println(cd);
}
}
/*
* 定义出租的事件,每次执行该方法只能租一张影碟
* @param name 客户的名称
* */
public String rent(String name){
String itemno=null;//记录组出的影碟编号
//在cdList集合中寻找在库isIn为true,且是供出租的碟子
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
for(CD cd:cdList){
if(cd.isIn //在库
&&(cd instanceof RentCD)){ //是供出租的影碟
System.out.println("found a cd for renting, it is:"+cd);
//为了操作方便,进行强制类型转换
RentCD rcd=(RentCD)cd;
rcd.customerName=name;
rcd.lastRentTime=sdf.format(new Date());//设定出租时间
rcd.rentnum++;//出租次数加1
rcd.isIn=false;
itemno=rcd.itemno;
break;//找到了,则退出循环
}
}
return itemno;
}
/*
* 定义归还的事件,每次执行该方法只能归还一张指定影碟编号的碟子
* @param name 客户的名称
* @param itemno 影碟的编号
* */
public void returncd(String name,String itemno){
//在cdList集合中寻找在库isIn为true,且是供出租的碟子
boolean isFound=false;
for(CD cd:cdList){
if(cd instanceof RentCD){
//为了操作方便,进行强制类型转换
RentCD rcd=(RentCD)cd;
if(rcd.customerName!=null
&&rcd.customerName.compareTo(name)==0
&&cd.itemno.compareTo(itemno)==0){
System.out.println("found the renting record, it is:"+rcd.getRentingInfo());
//发现后,做复位操作
rcd.customerName=null;
rcd.lastRentTime=null;
rcd.isIn=true;
isFound=true;
break;
}
}
}
if(!isFound){//没有发现将要归还的影碟对象,报出错误
System.out.println("not found the renging record, it is:"+name+",\t"+itemno);
}
}
/**
* 销售光盘,此销售事件中不考虑DVD还是VCD
* @param num 希望购买的盘数
* @return int 实际卖出的盘数,因为可能库存不足
*/
public int sail(int num){
//也可以这样使用数组列表这样的集合对象,你是否感觉还是上面的方法更简洁些
//在迭代数组列表中寻找每一个可供销售的影碟
SailCD cd=null;
int count=0;
for(int i=0;i<cdList.size();i++){
if(cdList.get(i) instanceof SailCD){
cd=(SailCD)cdList.get(i);//强制类型转换
if(cd.isIn){
++count;
cd.isIn=false;
}
}
if(count==num){
break;
}
}
return count;
}
//统计该影片可供销售的影碟库存
public int getCountForSail(){
int count1=0;
for(CD cd:cdList){
if(cd instanceof SailCD&&cd.isIn){
++count1;
}
}
return count1;
}
//统计该影片可供出租的影碟库存,请你尝试自己完成
public int getCountForRent(){
int count2=0;
for(CD cd:cdList){
if(cd instanceof RentCD&&cd.isIn){
count2++;
}
}
return count2;
}
public String toString() {
//StringBuffer是一个可以修改包含字符串内容的对象
StringBuffer sbf=new StringBuffer();
//向sbf中顺序追加将要输出的内容
sbf.append(this.title+",\t");
/*
* 由于直接输出issueTime不是一个很好的想法,因为默认输出格式不太吻合我们的习惯,所以
* 这里使用了一种格式化输出的方法,用了一个特别的类来处理,请注意
* */
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
//根据上述定义的格式将issueTime格式化为一个特别的字符串形式
sbf.append(sdf.format(this.issueTime)).append(",\t");
//sbf.append(**) 方法的返回值还是StringBuffer,所以可以连续使用append()方法,看起来比上面的语句要清晰些
sbf.append(this.director).append(",\t");
/*显示该商店的主人共采购了多少该电影的影碟,注意和数组的元素个数是不一样的,
数组的元素个数表示的是数组声明初始化时的长度,不会发生变化,而且length是一个属性
而ArrayList这样的集合对象,size()方法返回的是该集合当时包容的对象个数,实际可以容纳的对象个数也许会超出此数
*/
sbf.append(cdList.size());
return sbf.toString();//因为该方法要求返回的是String,所以需要转换
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -