1. 本周学习总结

2. 书面作业

1.代码阅读:Child压缩包内源代码

1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。

  • 不能。因为Parent类中的i是private,只有在本类中才能访问,子类中不能访问。可以改为 public或者protected。
  • 输出结果如下图
      class Parent{
      public int i=1;
      protected int j=2;
      protected int geti(){
      return i;//geti()返回的是i的值
      }
      public void getj(){
      System.out.println(j);
      }
      }    
      public class Child extends Parent{
      public static void main(String[] args){
      Parent p = new Parent();
      Child c = new Child();
      c.getParenti();
      c.getParentj();
      Other.showParentj(p);  
      }
      public void getParenti(){
      System.out.println(i);//因为i是public,所以都可以被访问。i=1
      }
      public void getParentj(){
      System.out.println(super.j);//这里的super.j是指访问父类的j,但是如果j是private就无法访问 j=2
      System.out.println(j);//j=2
      System.out.println(geti());//geti()=1,因为返回值是i
      System.out.println(super.geti());super.geti()=1
      }
      }
      class Other{
      public static void showParentj(Parent p){
      System.out.println(p.j);//p.j=2;
      System.out.println(p.geti());//p.geti()=1
      }
      }

1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?

  • 不能
  • 错误信息
    The public type OutOfParentPackage must be defined in its own file
    公共型outofparentpackage必须定义在它自己的文件
  • 这时,把public class OutOfParentPackage中的public删除,编译正常通过。
  • 由于我是把几个java代码放在了一个里面,所以只能有一个public类

java程序是从一个public类的main函数开始执行的,(其实是main线程),就像C程序是从main()函数开始执行一样。

只能有一个public类是为了给类装载器提供方便。 一个public 类只能定义在以它的类名为文件名的文件中。

每个编译单元(文件)都只有一个public 类。因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public 类,编译器就会报错。

并且public类的名称必须与文件名相同(严格区分大小写)。 当然一个编译单元内也可以没有public类。

在一个源文件.JAVA文件中可以有很多类,只有一个PUBLIC类其他的都不能是。

  • 输出结果:

2.abstract进阶:阅读GuessGame抽象类的设计与使用源代码

2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?

抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。

在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;

  • 简单来说,可以通过继承抽象类来实现多态,后期绑定,可以为将来要实现的东西做好接口。比如输入输出不会仅仅绑定控制台。
  • 同时,抽象类不能被实例化,可以通过方法的覆盖来实现多态的属性,也就是运行期绑定。

2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?

  • 首先要导入swing包 import javax.swing.*;

Swing 是一个为Java设计的GUI工具包。

Swing是JAVA基础类的一部分。

Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。

Swing它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。

  • 之后是要设计窗口。在 main 方法中,创建一个对象,调用从 JFrame 父类中继承的相关方法即可将窗口显示出来
  • 向窗口中添加第一个控件

2.3 结合该例子,你觉得什么时候应该使用abstract?

  • abstract(抽象)修饰符,可以修饰类和方法。
  • 如果是只想将一类对象的共同点抽象出来,成为代表该类共同特征的一个抽象概念,就可以用abstract修饰这个类的这个特征当作父类。###2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。

2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。

  • 不变的是猜数字这个游戏本身的游戏规则,游戏机制。不管我们的环境形式怎么变,这个游戏本质的规定都是一样的。计算机获取随机数,玩家去猜测数字。
  • 变了的是输入输出形式。不再与控制台绑定,反而是可以以任何一种形式进行。但是与此同时,没有定下具体的输入输出环境,也是没法开始游戏的,之前的绑定控制台就是其中一种形式。

3.Comparable与Comparator

3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?

  • Comparable接口是排序接口,此接口强行对实现它的每个类的对象进行整体排序,并重写Comparable接口中的compareTo。
  • 实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序
  • Arrays.sort(); //sort方法可以实现对对象数组排序,但是必须实现 Comparable接口。
  • 每个Comparable接口可以实现一种排序方法,多个Comparable接口可以实现多种排序方法。把排序类的对象传到Arrays.sort()就可以进行不同类型的排序

3.2 有了Comparable接口为什么还需要Comparator接口呢?

  • Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”,相当于一个内部比较器
  • Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序,相当于一个外部比较器。‘
  • 简单来说就是一个是自已完成比较,一个是外部程序实现比较的差别而已

4.面向接口案例分析

4.1 画出类关系图,描述每个类与接口的作用。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

  • StudenDaoListImpl使用的是列表(List)。List是一个接口,不能实例化
  • StudentDaoArrayImpl是使用数组

ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

  • StudentDaoArrayImpl里面写了每种方法的使用。

5.什么是面向接口编程?面向接口编程的好处是什么?

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。————《百度百科》

  • 设计接口的一个重要原则就是接口所处的环境,任何接口都是在一定的环境中产生的。
  • 面向接口编程先把客户的业务提取出来,作为接口。业务具体实现通过该接口的实现类来完成。当客户需求变化是,只需要编写该业务逻辑的新的实现类。
  • 面向接口编程在需要变动总体需求的时候,不需要改写现有代码,减少对系统的影响。代码易懂,方便扩展,可维护性强。
  • 但是因为我们一般的程序都比较小,接口设计也不是太合理,往往需求变了接口也要变。所以面向接口编程,对大家都好......

结合题目3与4中的Test.java的代码讨论分析

StudentDao sdm = new StudenDaoListImpl()

  • sdm定义为StydentDao接口,通过sdm.XXX直接调用方法。
  • 比如说我们对输入学生姓名的判断要进行改动,不需要动主程序,Test的代码内容基本可以保持不动。只要在接口里面修改代码即可。

结对编程:面向对象设计(大作业2-非常重要)

内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。

写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面

形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。

注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。 选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。

注:两个人在码云上新建一个项目。

姓名 地址
游舒婷 http://www.cnblogs.com/sakurai3104/p/6617348.html
杨晨露 http://www.cnblogs.com/ycll/p/6610019.html
码云 http://git.oschina.net/sakurai3104/Shopping

商品类,所有的商品都继承自这个类

public abstract class Goods {

    private String name;
    private double price;
    private String category;
    int num;
    
    public int getNum() {
        return num;
    }


    public void setNum(int num) {
        this.num = num;
    }


    public String getCategory() {
        return category;
    }


    public void setCategory(String category) {
        this.category = category;
    }


    


    public Goods(String category,String name,double price,int num)
    {
        setCategory(category);
        setName(name);
        setPrice(price);
        setNum(num);
    }
    
    
    
    @Override
    public String toString() {
        return category+"   名称:" + name + " \t价格:" + price +" \t库存:"+num;
    }
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    

}

书类,因为这里只定义了价格,书名和库存,就直接继承父类,没有再添加其他的属性。但是如果是比如衣服类的话,还要增加衣服的尺码等属性。

public class Books extends Goods{
    

    public Books(String category, String name,double price,int num) {
        super(category, name, price,num);
        
    }
    
    

    @Override
    public String toString() {
        return super.getCategory()+"   名称:" + super.getName() + " \t价格:" + super.getPrice()+" \t库存:"+super.getNum();
    }

}

购物车类

public class ShoppingCart extends Goods {
    
    private static int totalnum=0;
    private static double totalprice=0;
    private int cnum;
    
    
    public ShoppingCart(String category, String name, double price,int num,int cnum) {
        super(category, name, price,num);
        setCnum(cnum);
        setTotalprice(cnum);
        setTotalnum(cnum);
    }
    public int getNum() {
        return cnum;
    }

    public int getCnum() {
        return cnum;
    }

    public void setCnum(int cnum) {
        this.cnum = cnum;
    }

    public void setNum(int cnum) {
        this.cnum = cnum;
    }



    public int getTotalnum() {
        return totalnum;
    }

    public void setTotalnum(int cnum) {
        this.totalnum = cnum+this.totalnum;
    }

    public double getTotalprice() {
        return totalprice;
    }

    public void setTotalprice(int cnum) {
        this.totalprice = cnum*this.getPrice()+this.totalprice;
    }

    @Override
    public String toString() {
        return super.getCategory()+"   名称:" + super.getName() + " \t价格:" + super.getPrice() +" \t数量:"+cnum;
    }
    public static String total()
    {
        return "\t总价:"+totalprice+"\t\t总数:"+totalnum;
        
    }

}

3. 码云上代码提交记录

4.实验总结

(1)public :任何地方都能访问
(2)private:只有在本类中才能访问
(3)protected:只有在本包中才能访问,而在包外只有他的子类能访问
(4)默认:包访问权限 ,只有在本包才能访问,包括本包内的子类和普通类。但是在包外,都不能访问。
(5)
/**
   * 如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0;
   */
  @Override
  public int compare(Step o1, Step o2) {
    Date acceptTime1=UtilTool.strToDate(o1.getAcceptTime(), null);
    Date acceptTime2=UtilTool.strToDate(o2.getAcceptTime(), null);

posted on 2017-03-24 10:15  谷LL  阅读(335)  评论(9编辑  收藏  举报