《Java技术》第五次作业
(一)学习总结
1. xMind总结笔记
补充了抽象和接口的知识点

2. 汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。
工具:PowerDesigner
参考教程:UML 简介
-
程序设计思路:
客车类:Kcar 货车类:Hcar 皮卡类:PKcar 接口一:person接口 是用来表示载客量 接口二:goods接口 是用来表示载货量 抽象类:Car 是用来写Kcar、Hcar、PKcar共同的属性no、name、money的方法。

3. 不可以,原因有三点:
-
第一点:Dog类中eat方法没有public,没有可视性。在Dog里不能降低接口Animal的可视性。
-
第二点:Animal接口中有run方法,所以Dog也要有run方法。
-
第三点:Test类应该通过子类来实现接口实例化所以应该将:
Dog dog = new Dog(); -
改为:
Animal dog = new Dog(); -
修改后的程序:
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 running"); } } public class Test{ public static void main(String[] args){ Animal dog = new Dog(); dog.breathe(); dog.eat(); dog.run(); } } -
运行结果:
I'm breathing I'm eating I'm running
4. 源码(求助同学才知道该排序源码是那个,还有这个题的目的)
-
String类继承了comparable接口,使用compareTo方法比较,Arrays中只提供基本数据类型数组排序,其他的都从属于Arrays.sort(Object[]),对象数组的排序。其他的Object类型排序需要对象实现CompareTo接口,或使用实现了ComparaTor接口的对象作为Arrays.sort方法的第二个参数.(对象数组的比较可以用comparable、Comparator)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { //此处继承了comparable接口 public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; } } -
按照字母顺序逆序排序:
import java.util.Arrays; import java.util.Comparator; public class Test { public static void main(String[] args) { String[] fruits = { "peach", "banana", "orange", "apple" }; Arrays.sort(fruits, new Comparator<String>() { //覆写comparator方法,注意()里面才是覆写的new Comparator<String>() public int compare(String o1, String o2) { char a = o1.charAt(0); char b = o2.charAt(0); if(o1.equals(o2)){ return 0; }else if(a>b){ return -1; }else{ return 1; } } }); for (int i = 0; i < fruits.length; i++) { System.out.println(fruits[i]); } } }
5.其他总结
-
Edit->倒数第二项Export Image...->存储形式选择.png 就可以用图片的形式把类图存起来。
双击类:Override Inherited Operations是子类和父类的连接 Unimplemented Operations是接口和类之间的关系
(二)实验总结
1. 某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类
-
程序设计思路:
用工厂设计来实现,首先是一个接口,四个类,用接口实现联系。-
实验问题分析:
-
问题1:异常处理时,不提示怎样修改(我选择反射机制的方式去比较字符串)
-
原因:只写了try没写catch,他两是一个整体,不能只写一个。异常处理还有另外一种方式将异常处理方法放在方法名后。
public static MusicBox getInstance(String className)throws Exception
-
-
解决方案:用try和catch的方式解决异常处理
try { m = (MusicBox) Class.forName(className).newInstance(); } catch(Exception e){ e.printStackTrace(); }
2. 修改实验三的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)
-
程序设计思路:
用Date表示日期,要先把字符串转成日期,再输出的时候转会Date类型(根据369页的例题写出了Date和String之间的转换)。用comparable和comparator(比较时括号要数组对象和比较器的匿名对象)方法时比较的是属性。 -
实验问题分析:
-
问题1:
![]()
-
没有建立接口(书384页特地强调了)。
-
解决方案:
public class Employee implements Comparable<Employee>; -
问题2:用Arrays.sort时第二个参数填写不正确,不知道该调用谁
-
原因:第二个参数应该是比较器的匿名对象。
-
解决方案:比较器放入Employee里面了,所以调用的匿名对象应该是Employee的对象.两种方式:
(1)Employee empa=new Employee(); Arrays.sort(emps,empa);
(2)
Arrays.sort(emps, new Employee());
3. 宠物商店
-
程序设计思路:
根据书224,写出dog类、cat类和pet接口,宠物狗有大小型之分,我就利用继承抽象类实现接口,书199有具体例子。将大小型设为子类继承父类dog。(在test中实例化对象的时候用的是子类dogsize),在用instanceof关键字时候可以用Dog父类,也可以用dogSize子类。 -
实验问题分析:
-
问题1:关键字查找方法,返回的是Pet[] p数组,我想把这个数组给我新建的数组String[] total;这个是行不通的
-
原因:
因为Pet[] p是pet类的数组,不可以直接转化为String类型的数组。(想法有偏差,他返回的已经是个数组直接把数组输出就是,购买的宠物。再定义算价钱数量的方法直接将返回的数组带入就可求的,算价钱数量的方法也的参数要是Pet接口的数组,因为判断他是否是cat类和dog类时要用到instanceof关键字,pet就是接口,所以定义的数组必须是pet接口数组,pet接口数组同样也是pet和petshop之间的联系) -
解决方案:
将关键字方法重新修改,该方法的参数应该是关键字,因为有人可能会买很多宠物,所以定义一个关键字数组。将输入的宠物编号利用循环放入该关键字数组。
public Pet[] search(String[] total);
问题2:不知道该如何把顾客买的cat和dog分开计算并算价格。
原因:对学过的知识印象不深,询问同学后,才知道用instanceof关键字就可进行分类。因为shoppingCart方法参数定义的就是pet接口的数组,所以查到cat和dog后,可直接调用getPrice方法找出价钱。 -
解决方案:
if (pets[i] instanceof Cat) { //instanceof关键字是判断对象是那个类的实例(返回boolean类型) price1 += pets[i].getPrice(); num1++; } if (pets[i] instanceof dogSize) { //pets[i] instanceof Dog price2 += pets[i].getPrice(); num2++; }
(三)代码托管
- 码云commit历史截图(代码地址)
![]()
(四)学习进度条
| 代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
|---|---|---|---|
| 目标 | 5000行 | 300小时 | |
| 第2-4周 | 400/400 | 40/40 | 课上讲的String类用法,温习了很多遍,写程序的时候也查了不少资料,对各种类型做了总结。 |
| 第5周 | 450/850 | 45/85 | 复习了上课讲的知识,并且在完成学习总结的时候查阅了很多资料去了解单列设计模式 等知识点,还将ppt上的程序打了一遍。 |
| 第6周 | 300/1250 | 35/120 | 从课外书上更深的了解了抽象类,同学介绍的网站上面了解了类图的画法。 |
| 第7周 | 400/1250 | 40/160 | 对接口了解不够深,请同学给我讲了讲,翻资料找了些关于接口的程序去敲。 |


浙公网安备 33010602011771号