《Java技术》第五次作业
《Java技术》第五次作业
(一)学习总结
1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。

2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。
- 设计思路
(1)将客车的有载客量,货车的有载货量,分别设计为一个接口。
(2)出租汽车设计成抽象类,包括编号、名称、租金属性。
(3)客车、货车、皮卡分别继承出租汽车类,再分别实现应有的接口。
![]()
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)在接口中声明的方法必须是public abstract,也是系统默认的,而本题中省略了,但在类中实现接口所定义的方法时,方法的声明必须和接口中定义的完全一致,类中必须显示使用public修饰符。
(2)非抽象类必须实现接口中的所有方法。 -
改正
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){ 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 类的源码,说明是如何实现的?如果现在希望对输出的结果进行降序排序,该如何处理?修改上述代码,实现按照字母顺序逆序排序。
源代码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence{
private final char value[];
private int hash;
private static final ObjectStreamField[] serialPersistentFields =new ObjectStreamField[0];
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;
}
修改
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]);
}
}
}
(二)实验总结
1.某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。
- 程序设计思路
(1)将MusicBox设计为接口,在接口中定义音乐盒播放的方法。
(2)分别新建PianoBox类、ViolinBox类,在类中实现接口中定义的play方法。
(3)建MusicBoxFactory类,将MusicBox实例化。
(4)测试类,用户输入即将播放的音乐盒,实现了MusicBox的实例化,调用play()方法并输出。
2.修改第三次作业的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)
-
程序设计思路
(1)建员工类,具有编号,姓名,性别的属性,员工和部门设置联系,添加Dept类的对象,并且定义两个属性Date类型的,出生日期和参加工作时间,写一个对日期输出格式的格式化方法和一个使用Comparable接口比较生日大小的方法。
(2)建部门类,具有部门编号,部门姓名属性,设置与员工类的联系,定义员工类的对象和对象数组。
(3)写Comparator接口,实现员工生出生日期的排序,在接口中写比较方法和equals方法。
(4)测试类,实例化员工的信息并输出,还要输出两种比较员工出生年月的结果。 -
问题
不知道Date类的两个属性在哪里定义,起初在测试类直接建Date类的对象,并转化成String类型并输出。 -
原因
没有建立联系,出生年月和参加工作时间都是属于员工的。 -
解决方案
应该在员工类里定义两个属性,然后在输出时以格式化方式输出日期。public String toString(){
return "员工编号: "+this.eno+" 姓名: "+this.ename+" 性别: "+this.sex+" 生日:"+new SimpleDateFormat("yyyy-MM-dd").format(birth) +"参加工作时间:"+new SimpleDateFormat("yyyy-MM-dd").format(date);
}
3.在案例宠物商店的基础上,实现以下功能:
(1)展示所有宠物
(2)购买宠物
(3)显示购买清单
- 程序设计思路
(1)在宠物商店类中定义输出宠物的方法print()。
(2)在主方法中,建宠物商店类型的对象,写一个返回宠物价钱的方法,当调用查找宠物的方法和用户输入的宠物名字相比较,一致时,返回宠物价钱,再用数组存储,并计算宠物的总价钱。 - 问题
这次题目有点复杂,没有达到题目要求,我的这个程序是对它的理解,接下来多看书了解方法内容,再重构。
(三)代码托管
- 码云commit历史截图



浙公网安备 33010602011771号