《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++;
     	}
    

(三)代码托管

(四)学习进度条

代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 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 对接口了解不够深,请同学给我讲了讲,翻资料找了些关于接口的程序去敲。