201621123031 《Java程序設計》第3周學習總結


Week03-面向對象入門


  1. 本周學習總結

初學面向對象,會學習到很多碎片化的概念與知識。嘗試學會使用思維導圖將這些碎片化的概念、知識點組織起來。請使用工具畫出本周學習到的知識點及知識點之間的聯系。步驟如下:

1.1 寫出你認為本周學習中比較重要的知識點關鍵詞,如類、對象、封裝

關鍵詞:類,對象,構造函數,封裝,關鍵字(this,final),方法,初始化塊。

1.2 用思維導圖或者Onenote或其他工具將這些關鍵詞組織起來。


  1. 書面作業

1.以面向對象方式改造數據結構作業'有理數'(重點)

注意:屬性必須修飾為為private

1.1 截圖你主要代碼(需要在程序中出現你的學號和姓名)並粘貼程序的git地址。


有理數代碼的git地址

1.2 對比你的代碼與歷程的代碼,說明面向對象編程與面向過程編程有何區別?

答:例程的代碼是面向過程的,其是有許多的函數組成,然后再在主方法里調用各種函數來實現其數學運算。而在改寫時,是想這些屬性方法都放進一個類中,然后在主函數中用對象來調用這些類中的方法來實現計算。總的來說就是,面向過程是依照解決問題的過程來構造函數一步步解決,而面向對象則是將問題抽象成一個個類,在類中實現解決這一類問題的方法,然后在主函數中構造對象,讓對象來調用類中的方法來實現。

2. 構造函數與初始化塊

2.1 結合PTA 5(構造函數與toString)說明構造函數有什么用?其函數格式有何特征?

答:在題目中有兩種構造函數,一種是有參的構造函數,一種是無參的構造函數,構造函數的作用主要有兩個方面:
一是初始化對象,在題目中,當我們調用有參的構造函數public Person(String name,int age,boolean gender)時,就對其中的nameagegender的值進行了初始化。
二是創建對象,像我們平時的創建對象其實就是調用無參的構造函數,創建了對象,我們就可以使用其對應的類中的屬性方法。
構造函數的格式特征:

  • 構造方法沒有返回值
  • 構造方法沒有返回類型
  • 構造方法的名稱要和類名相同

2.2 如果一個類不寫構造函數,它有構造函數嗎?如果一個類中只有帶參的構造函數,它有沒有不帶參數的默認構造函數?

答:如果一個類不寫構造函數,系統會自動創建一個不帶參數的構造函數。
但是如果一個類中只有有參的構造方法,那么編譯器就不會為這個類定義一個無參的構造方法。

2.3 查看String類的源代碼,找出3個看得懂的String類的構造函數,並使用自己的話描述這3個構造函數的區別。


此構造方法會創建一個空字符串。

此構造方法傳入一個數組,然后將數組中的內容逐一復制到字符串中去。

此構造方法將一個字節數組轉換為一個字符串。

2.4 結合PTA(構造函數與初始化塊)說明初始化塊與構造函數的異同。並說明,初始化塊與構造函數誰先執行?初始化塊與靜態初始化塊有何不同,誰先執行?

構造函數與初始化塊都可以用於給對象進行初始化,不同的是,構造函數只能初始化相應的對象,而初始化塊可以初始化所有對象,另外,初始化塊不能接受參數,而構造函數可接受參數也可有無參的構造方法。
初始化塊總是比構造函數先執行。
靜態初始化塊與初始化塊相比帶有static關鍵字。並且隨着類的加載,靜態初始化塊只執行一次。
靜態初始化塊比初始化塊先執行。

3.代碼分析:Math類

3.1 使用java.lang.Math類的方法時,為什么不需要new出一個Math對象,然后調用該對象上相應的方法?

答:因為通過Math類的源代碼可以看出,Math類雖然不是一個靜態類,但是它里面的所有屬性和方法都是靜態的,所以可以用類名.方法名來直接調用。

3.2 如果new Math()會產生什么錯誤?嘗試閱讀Math類源代碼,分析原因。

答:當new Math()時會產生“The constructor Math() is not visible”的錯誤提示,通過下面Math類的源碼可以看出,它被聲明成私有的,所以不能被外部所調用,自然也不能用new來新建對象。

3.3 進一步:你覺得什么樣的對象需要new出來才能用,調用什么方法時不必創建相應對象就可以使用?(重點檢查)

非靜態的類需要使用new才能用。
當調用的方法是static類型時可以不用創建對象就能使用,使用對象名.方法名來直接調用。

4. 重載Overload

4.1 什么是重載?什么是構造函數重載?怎么才能區分兩個重載的方法?

答:在Java中重載是在一個類中,可以有多個參數不同,但方法名相同的方法。
構造函數的重載指的是構造函數的的名字相同,而其中的參數個數或者參數類型不同。
區分兩個重載方法根據方法的參數個數以及類型來確定。

4.2 在java.lang.Math類中舉出1個方法重載的例子?

如下圖兩個方法就為方法重載:

5. 代碼閱讀: final

final修飾的變量不能改變,為什么如下代碼卻可正常運行?

final int[] NUMBS= {1,2,3,4,5}; NUMBS[2] = 1;

答:因為使用final修飾的變量不能被改變,但是數組是引用型的,final不能改變數組所指向的地址,但是對於引用所指向的對象,其對象是可以改變的。

6. Java8中的時間日期類:編寫函數public static boolean isMondayToFriday()

功能:判斷今天如果是周一到周五,返回true,返回false。main函數中調用該函數,如果為true則輸出“工作日+姓名學號”,否則輸出"休息+姓名學號"。
截圖:關鍵代碼。

7. 封裝

7.1 結合PTA(形狀),請用自己的話簡單總結一下面向對象中封裝是什么意思?有何好處?

答:封裝就是將類中某些對象的屬性和方法隱藏起來不讓外部直接操作這些數據,在pta中,我們將其矩形和圓形類中的長寬和半徑使用權限修飾符private進行修飾來達到封裝的目的,這時候在類的外部就不能直接操作這些數據了。
封裝可以避免內部的一些數據被外部的某些操作所影響,提高了程序的性能。

7.2 和封裝有關的關鍵字有哪些?

答:和封裝有關的關鍵字有以下四個:

  • private
  • default
  • protected
  • public

8. 結對編程實踐(未完成,0分)

我的結對對象是秦玉。我們完成的題目是pta的7-6 面向對象-06-繼承覆蓋綜合練習
這一題的題目內容較多,考察的點也蠻多的,剛開始的時候我們先大概討論了一下,然后根據每個類的特點來進行編寫,本來我們打算一人編寫兩個類,但是最后發現每個類之間都有一定的聯系,所以還是需要互相交流對方的類的編寫方法以及其中的內容才能繼續編寫,最后的排序也是討論了很久的內容,還上網查了很多關於Collections.sort的方法,最后再一起討論關於排序的具體步驟,然后過程中碰到了問題也會一起討論,解決的速度也比一個人來的快,總的來說感覺還是OK的。

9. 選做:Runnable Jar

我們以前編寫的程序,必須打開Eclipse或者將相應的.class文件拷貝出來在命令行下執行相應命令才能運行,如果.class文件較多且類文件中有包名,需要將完整的目錄結構及文件拷貝出來,才能運行。現在希望將Eclipse項目中的Java文件打成一個可運行的jar包,在命令行直接運行。改造題目6,使其從命令行接收參數,參數為年-月-日,如1999-09-09。最后將項目打成可運行的jar包,然后在命令行通過java -jar運行,並截圖。




  1. 碼雲及PTA

3.1. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然后搜索並截圖

3.2 截圖PTA題集完成情況圖



3.3 統計本周完成的代碼量

需要將每周的代碼統計情況融合到一張表中,可使用最新版的代碼統計工具的-history參數,詳細用法見項目wiki地址。表格如下所示:

周次 總代碼量 新增代碼量 總文件數 新增文件數
2 607 607 15 15
3 1642 1035 33 18


免責聲明!

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



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