• JAVA第五次作业


    Java第五次作业

    (一)学习总结

    1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。

    2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。

    • 设计思路: 定义两个接口:乘客person和货物goods。
      定义抽象方法父类汽车car,定义子类客车coack,货车van,皮卡pickup。
      父类属性编号number,名称name,租金price;子类继承父类的属性。
      设计接口客车->乘客,货车->货物,皮卡->乘客和货物。

    • 类图


    工具:PowerDesigner
    参考教程:UML 简介
    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.接口Animal定义的抽象方法,必须全部覆写和调用,而上面的程序没有覆写和调用Run
      2.在实现接口所定义的eat()方法时,没有显示public修饰符

    • 修改后:

           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();
                   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类的源码,说明是如何实现的?如果现在希望对输出的结果进行降序排序,该如何处理?修改上述代码,实现按照字母顺序逆序排序。

    • 查看String源码

            public int compareTo(String anotherString) {
            int len1 = count;
            int len2 = anotherString.count;
            int n = Math.min(len1, len2);
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            if (i == j) {
                int k = i;
                int lim = n + i;
                while (k < lim) {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2) {
                    return c1 - c2;
                }
                k++;
                }
            } else {
                while (n-- != 0) {
                char c1 = v1[i++];
                char c2 = v2[j++];
                if (c1 != c2) {
                    return c1 - c2;
                }
                }
            }
            return len1 - len2;
            }
      

    由源码可知,该排序方法使用了comaraTo方法作比较

    • 降序排序:

            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]);
                           }
                       }
                   }
      
    • 运行结果:
      peach
      orange
      banana
      apple

    5.其他需要总结的内容。

    用compareTo作对java.util.Date类比较的两种方法

    • 降序

       	public int compareTo1(Worker per2){
       			int result =0;
       			result = -this.birthday.compareTo(per2.birthday);
       			if(0==result){
       				return -1;
       			}else{
       				return result;
       			}
       	} 
      

            public int compareTo(Worker per) {
            		 if (this.getBirthday().getTime() < per.getBirthday().getTime()) { 
                        return 1; 
                     } else if (this.getBirthday().getTime() > per.getBirthday().getTime()) { 
                        return -1; 
                     } else { 
                       return 0; 
                     } 
            	}
    
    • 升序

       	public int compareTo1(Worker per2) {
       		 if (this.getBirthday().getTime() > per2.getBirthday().getTime()) { 
                   return 1; 
                } else if (this.getBirthday().getTime() < per2.getBirthday().getTime()) { 
                   return -1; 
                } else { 
                   return 0; 
                } 
       	}
      

    (二)实验总结

    实验内容:
    1.某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。

    • 程序设计思路:定义一个MusicBox接口和play()方法,再定义PianoBox,ViolinBox子类,覆写play()方法,定义MusicBoxFactory类,用Reflection机制产生实例的方法对子类实例化接口(参考教材215页)
    • 问题:

    2.修改第三次作业的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)

    • 程序设计思路:在实验三第一题的基础上,去掉日期类,在员工类中添加java.util.Date类,定义Date birthday和Date time属性表示出生日期和工作时间,分别在员工类中覆写comparable和comparator方法对出生日期升序输出,再用comparator方法对出生日期降序输出,要建一个WorkerComparator抽象类

    • 问题1:覆写comparable方法时,作比较出错,显示错误为未对参数类型java.util.Date定义运算符

    • 原因:做比较时,直接按照书上的方法,this.birthday > per.birthday进行比较

    • 解决方案: this.getBirthday().getTime() > per.getBirthday().getTime()

    • 问题2:用comparator方法时,写测试类时, Arrays.sort (per,new WorkerComparator());该语句显示无法实例化类型WorkerComparator()

    • 原因:没有单独写WorkerComparator()类

    • 解决方案:

        import java.util.Comparator;
        public class WorkerComparator implements Comparator<Worker> { 
            public int compare(Worker per1,Worker per2) { 
                    if (per1.equals(per2)) { 
                          return 0; 
                   } else if (per1.getBirthday().getTime() < per2.getBirthday().getTime()) { 
                      return 1; 
                  } else { 
                        return -1; 
                 } 
          } 
        }
      

    3.在案例宠物商店的基础上,实现以下功能:
    (1)展示所有宠物
    (2)购买宠物
    (3)显示购买清单

    完成实验内容,代码上传到码云,并对完成实验内容过程中遇到的问题、解决方案以及程序的设计思路和思考等进行归纳总结。

    • 程序设计思路:利用接口和抽象类之间的关系,定义宠物接口,子类宠物猫和宠物狗实现宠物接口,测试类,用输入函数,选择宠物(参考教材P225)
    • 问题: 测试类出现错误,程序不能正常运行
    • 原因:循环方法不对
    • 解决方案:参考任秀兴第三题的测试类,自己修改

    (三)代码托管

    码云commit历史截图

  • 相关阅读:
    atitit.ntfs ext 文件系统新特性对比
    Atitit.图片木马的原理与防范 attilax 总结
    Atitit.图片木马的原理与防范 attilax 总结
    Atitit.jdk java8的语法特性详解 attilax 总结
    Atitit.jdk java8的语法特性详解 attilax 总结
    Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
    Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
    Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结
    Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结
    Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216  java c# php js.docx
  • 原文地址:https://www.cnblogs.com/HQY110/p/6761402.html
Copyright © 2020-2023  润新知