Java第五次作业
(一)学习总结
1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。
2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。
-
设计思路: 定义两个接口:乘客person和货物goods。
定义抽象方法父类汽车car,定义子类客车coack,货车van,皮卡pickup。
父类属性编号number,名称name,租金price;子类继承父类的属性。
设计接口客车->乘客,货车->货物,皮卡->乘客和货物。 -
类图
工具:PowerDesigner
参考教程:UML 简介
3.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果
interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
void eat(){
System.out.println("I'm eating");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
-
不能
-
原因:
1.接口Animal定义的抽象方法,必须全部覆写和调用,而上面的程序没有覆写和调用Run
2.在实现接口所定义的eat()方法时,没有显示public修饰符 -
修改后:
interface Animal{ void breathe(); void run(); void eat(); } class Dog implements Animal{ public void breathe(){ System.out.println("I'm breathing"); } public void eat(){ System.out.println("I'm eating"); } public void run() { System.out.println("I'm runing"); } } public class Test{ public static void main(String[] args){ Dog dog = new Dog(); dog.breathe(); dog.eat(); dog.run(); } }
4.运行下面的程序
import java.util.Arrays;
public class Test{
public static void main(String[] args){
String[] fruits = {"peach","banana","orange","apple"};
Arrays.sort(fruits);
for(int i = 0;i < fruits.length;i++)
{
System.out.println(fruits[i]);
}
}
}
程序输出的结果是升序排序的。查看String类的源码,说明是如何实现的?如果现在希望对输出的结果进行降序排序,该如何处理?修改上述代码,实现按照字母顺序逆序排序。
-
查看String源码
public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.count; int n = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; if (i == j) { int k = i; int lim = n + i; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } } else { while (n-- != 0) { char c1 = v1[i++]; char c2 = v2[j++]; if (c1 != c2) { return c1 - c2; } } } return len1 - len2; }
由源码可知,该排序方法使用了comaraTo方法作比较
-
降序排序:
import java.util.Arrays; public class Test{ public static void main(String[] args){ String[] fruits = {"peach","banana","orange","apple"}; Arrays.sort(fruits); for(int i = fruits.length-1;i >= 0;i--) { System.out.println(fruits[i]); } } }
-
运行结果:
peach
orange
banana
apple
5.其他需要总结的内容。
用compareTo作对java.util.Date类比较的两种方法
-
降序
public int compareTo1(Worker per2){ int result =0; result = -this.birthday.compareTo(per2.birthday); if(0==result){ return -1; }else{ return result; } }
或
public int compareTo(Worker per) {
if (this.getBirthday().getTime() < per.getBirthday().getTime()) {
return 1;
} else if (this.getBirthday().getTime() > per.getBirthday().getTime()) {
return -1;
} else {
return 0;
}
}
-
升序
public int compareTo1(Worker per2) { if (this.getBirthday().getTime() > per2.getBirthday().getTime()) { return 1; } else if (this.getBirthday().getTime() < per2.getBirthday().getTime()) { return -1; } else { return 0; } }
(二)实验总结
实验内容:
1.某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。
- 程序设计思路:定义一个MusicBox接口和play()方法,再定义PianoBox,ViolinBox子类,覆写play()方法,定义MusicBoxFactory类,用Reflection机制产生实例的方法对子类实例化接口(参考教材215页)
- 问题:无
2.修改第三次作业的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)
-
程序设计思路:在实验三第一题的基础上,去掉日期类,在员工类中添加java.util.Date类,定义Date birthday和Date time属性表示出生日期和工作时间,分别在员工类中覆写comparable和comparator方法对出生日期升序输出,再用comparator方法对出生日期降序输出,要建一个WorkerComparator抽象类
-
问题1:覆写comparable方法时,作比较出错,显示错误为未对参数类型java.util.Date定义运算符
-
原因:做比较时,直接按照书上的方法,this.birthday > per.birthday进行比较
-
解决方案: this.getBirthday().getTime() > per.getBirthday().getTime()
-
问题2:用comparator方法时,写测试类时, Arrays.sort (per,new WorkerComparator());该语句显示无法实例化类型WorkerComparator()
-
原因:没有单独写WorkerComparator()类
-
解决方案:
import java.util.Comparator; public class WorkerComparator implements Comparator<Worker> { public int compare(Worker per1,Worker per2) { if (per1.equals(per2)) { return 0; } else if (per1.getBirthday().getTime() < per2.getBirthday().getTime()) { return 1; } else { return -1; } } }
3.在案例宠物商店的基础上,实现以下功能:
(1)展示所有宠物
(2)购买宠物
(3)显示购买清单
完成实验内容,代码上传到码云,并对完成实验内容过程中遇到的问题、解决方案以及程序的设计思路和思考等进行归纳总结。
- 程序设计思路:利用接口和抽象类之间的关系,定义宠物接口,子类宠物猫和宠物狗实现宠物接口,测试类,用输入函数,选择宠物(参考教材P225)
- 问题: 测试类出现错误,程序不能正常运行
- 原因:循环方法不对
- 解决方案:参考任秀兴第三题的测试类,自己修改
(三)代码托管
码云commit历史截图