• Java 第五周总结


    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 + " 	价格:" + price +" 	库存:"+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() + " 	价格:" + super.getPrice()+" 	库存:"+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() + " 	价格:" + super.getPrice() +" 	数量:"+cnum;
        }
        public static String total()
        {
            return "	总价:"+totalprice+"		总数:"+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);
    
    
  • 相关阅读:
    模板
    洛谷
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    洛谷
    洛谷
    洛谷
    NOIP 普及组 2016 海港
  • 原文地址:https://www.cnblogs.com/ycll/p/6610019.html
Copyright © 2020-2023  润新知