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 + " \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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM