Java 第五次作业
(一)学习总结#
1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。参考资料:XMind##
2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。工具:PowerDesigner 参考教程:UML 简介##
- 程序设计思路:创建一个汽车抽象类(carRentalCompanies类)包括编号,名称,租金属性;创建三个汽车类(Car类,Trunk类,PickupTrunk类)继承汽车抽象类(carRentalCompanies类),其中Car类继承载客接口,Trunk继承载货接口,PickupTrunk继承载货和载客接口;创建两个接口(载客接口Busload,载货接口Burden),载客接口显示载客量方法,载货接口显示载货量方法
- 类图:
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.类型 Dog 必须实现继承的抽象方法 Animal.run() 2.不能降低自 Animal 继承的方法的可视性
- 修改如下
public void eat(){
System.out.println("I'm eating");
}
public void run() {
}
- 运行结果:
I'm breathing
I'm eating
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 final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final int offset;
private final int count;
public String() {
this.offset = 0;
this.count = 0;
this.value = new char[0];
}
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
-
定义一个String对象original,一个新数组originalValue,排序时,如果originalValue长度大于count,就对originalValue进行排列,排列后赋给新数组v,否则将originalValue赋给另一个数组v
-
修改如下:
for(int i = fruits.length-1;i >= 0;i--)
{
System.out.println(fruits[i]);
}
5.其他需要总结的内容。##
- 正则表达式判断Email地址合法性;instanceof判断是否是实例;最好用Comparable接口比较对象排序;
- 如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,就需要用Comparator接口
- 在抽象类中可以定义多个内部抽象类,在接口中可以定义多个内部接口
(二)实验总结#
实验内容:##
1.某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。##
- 程序设计思路:创建MusicBox接口,Pianobox类、ViolinBox类,MusicBoxFactory类,Pianobox类和ViolinBox类继承MusicBox接口,MusicBoxFactory 产生MusicBox的实例,测试类Test01测试
- 问题1:工厂设计模式实现的不熟练,会出现一些错误
- 解决方案:多加练习,看课件
2.修改第三次作业的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)##
- 程序设计思路:将工作时间和出生日期设为Date类,输入时输入字符串,然后将字符串转换为Date类储存,然后将Employee类实例化对象,输出日期时,将Date类转换为字符串输出
- 问题1:输出员工生日时,生日的月份都是00
- 解决方案:把yy-MM-dd改成yy-mm-dd
- 问题2:Comparatable接口的使用方法不熟练
- 解决方案:在employee类中覆写compareTo(Employee employee)方法
- 问题3:Comparator接口的使用方法不熟练
- 创建EmployeeComparator,继承Comparator接口
3.在案例宠物商店的基础上,实现以下功能:##
(1)展示所有宠物##
(2)购买宠物##
(3)显示购买清单##
- 程序设计思路:创建一个宠物接口和两个子类以及宠物商店,Dog和Cat类继承宠物接口属性,宠物狗还要有类型属性,在宠物商店中
应该包含一个宠物接口的对象数组 - 问题1:在测试类中调用对象数组,总是显示有错误
- 原因:private pet[] pets 不能定义为私有的,因为类外还要调用
- 解决方案:变为pet[] pets
- 问题2:不会显示购物清单
- 原因:宠物商店中的方法传给对象数组,不能判断属于哪种动物
- 解决方案:使用instanceof关键字,判断属于哪个实例
(三)代码托管#
(https://git.oschina.net/hebau_cs15/hebau-cs01GHJ.git)