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)

码云历史截图##

commit历史截图##

posted @ 2017-04-25 17:17  长长长长的街道  阅读(340)  评论(0编辑  收藏  举报