《Java技术》第五次作业
(一)学习总结
1.
2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。
- 程序设计思路:
类:
抽象类 汽车:class Car
客车:class PassengerCar
货车:class Truck
皮卡:class PickUpTruck
接口:
载货量:interface Goods
载客量:interface Passenger
(1)在汽车类中声明私有属性:编号、名称、租金;
(2)客车类、货车类和皮卡类分别为汽车类的子类,客车类实现载客量,货车类实现载货量,皮卡类实现载货和载客量;
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();
}
}
不能通过编译。问题有两点:
一、子类Dog在实现接口Animal时,eat()方法的可视性应为public;
二、子类Dog中必须同时覆写3个抽象方法,而Dog类中没有run()方法的覆写。
修改后为:
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();
}
}
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]);
}
}
}
若要降序输出应改为:
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]);
}
}
}
在String类中,重写了compareTo方法,即按字典顺序比较字符串,比较基于字符串中各个字符的 Unicode 值
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;
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]);
}
}
}
5.对于一个子类需要“继承”两个父类是不可能,但可以使用接口,一个子类是可以实现两个接口的。
一般使用comparable进行排序,comparator需要单独写一个类。
(二)实验总结
1.某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。
- 程序设计思路:
(1)首先定义MusicBox接口,声明方法play();
(2)定义PianoBox类和ViolinBox类,分别实现MusicBox接口;
(3)在上述两个类中分别重写play()方法;
(4)定义MusicBoxFactory类,在里面定义接口对象,用来接收用户输入的信息,并判断是哪个子类的标记,进行实例化接口并将其返回;
(5)定义测试类Test,进行输入输出测试。
2.修改第三次作业的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)
- 程序设计思路:
(1)根据作业三第一题,删除重写的Date类,需要修改Employee职工类和Test测试类。
(2)首先修改Employee类,使用SimpleDateFormat类中的方法定义一个日期的格式sdf:"yyyy-MM-dd",再修改getEbir()//生日 、getEwkt()//工作时间 方法返回值为Date类型,修改setEbir(String bir)、setEwkt(String wkt)方法,使用sdf.parse()方法捕获字符串中的日期并转换为Date类。在重写的toString()方法中使用sdf.format()方法进行格式化输出;
(3)修改Test类,将实例化对象的数据进行修改,即将工作时间和出生日期作为String类型进行输入。
(4)若使用comparalbe实现排序,须将Employee类定义接口指定泛型为Employee,并重写compareTo方法,使用getTime()方法进行日期大小的判断,实现排序规则;
(5)若使用comparator实现排序,须重新定义一个EmployeeComparator类实现接口,使用getTime()方法判断日期的大小并进行比较,从而实现排序规则。
3.在案例宠物商店的基础上,实现以下功能:
(1)展示所有宠物
(2)购买宠物
(3)显示购买清单
- 程序设计思路:
(1)定义Pet类构造方法,定义编号、类型、颜色、年龄、价格等属性,使用set和get方法实现输入输出;
(2)定义Dog类和Cat类分别继承Pet类,并分别定义方法count和price方法来进行计数和计算价格,在Dog类中增加一个smallOrLarge()方法来记录大型犬或小型犬;
(3)定义Buy类,定义一个Pet类的数组,用来记录购买的宠物;
(4)在用户界面类进行输入输出:先将各个宠物的信息输入,再记录用户的选择,使用循环实现重复购买,定义一个长度等同于宠物数量的int型数组,初始化全为0,当用户选择宠物时,在相应的下标进行加1操作,用来记录用户的选择。当用户选择完后,利用该数组进行判断,并将相应的宠物写入Buy类中定义的对象数组,再进行输出。
(三)代码托管
- 码云commit历史截图