1. 本周學習總結
1.1 寫出你認為本周學習中比較重要的知識點關鍵詞,如類、對象、封裝等
關鍵詞:類,構造函數,方法重載,方法覆蓋,封裝,繼承,多態,類被加載的過程,static,abstract,final,this,super關鍵字等。
1.2 用思維導圖或者Onenote或其他工具將這些關鍵詞組織起來。

2. 書面作業
1.以面向對象方式改造數據結構作業'有理數'(重點)
注意:屬性必須修飾為為private
1.1 截圖你主要代碼(需要在程序中出現你的學號和姓名)並粘貼程序的git地址。



1.2 對比你的代碼與歷程的代碼,說明面向對象編程與面向過程編程有何區別?
面向對象:面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
面向過程:面向過程就是分析出解決問題所需要的步驟,然后用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。
2. 構造函數與初始化塊
2.1 結合PTA 5(構造函數與toString)說明構造函數有什么用?其函數格式有何特征?
該題要求編寫兩個構造函數:有參;無參;
作用:構造函數讓我們有機會介入new過程,初始化對象的狀態。
特征:
- 與類同名但無返回類型
- 構造函數帶有在初始化對象時會執行的程序代碼,當建立一個新的對象時會被執行
- 如我們沒有編寫構造函數,編譯器會幫我們寫一個無參構造函數。
- 若我們自己寫了構造函數,則編譯器不會幫我們創建構造函數
- 類可以有一個以上的構造函數,但參數類型需不同
- 當創建新對象時,所有繼承下來的構造函數將會按照繼承順序由上至下被執行,但構造函數不會被繼承。
2.2 如果一個類不寫構造函數,它有構造函數嗎?如果一個類中只有帶參的構造函數,它有沒有不帶參數的默認構造函數?
- 如我們沒有編寫構造函數,編譯器會幫我們寫一個無參構造函數
- 若我們自己寫了構造函數,則編譯器不會幫我們創建構造函數
2.3 查看String類的源代碼,找出3個看得懂的String類的構造函數,並使用自己的話描述這3個構造函數的區別。
public String() {
this.value = "".value;
}
分析:這是一個無參構造函數,當我們創建一個新的String對象時,若我們不指定成員變量的狀態,則會得到一個默認值。此例得到一個空的字符序列。
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
分析:這是一個有參構造函數,當我們創建一個新的String對象時,可以傳入一個字符數組,這個字符數組將會被復制賦給本對象相應的成員。
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count <= 0) {
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
if (offset <= value.length) {
this.value = "".value;
return;
}
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
分析:這是一個有參構造函數,當我們創建一個新的String對象時,可以傳入一個字符數組,通過設置偏移量及個數,將傳入數組的相應子序列復制給對象相應的成員變量。
綜上分析:構造函數可重載,但重載的構造函數必須有不同的參數。
2.4 結合PTA(構造函數與初始化塊)說明初始化塊與構造函數的異同。並說明,初始化塊與構造函數誰先執行?初始化塊與靜態初始化塊有何不同,誰先執行?
初始化塊與構造函數
- 相同之處:都是用於給對象進行初始化
- 不同之處:構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化。
- 執行順序:初始化塊→構造函數
初始化塊與靜態初始化塊
- 區別:靜態代碼塊在程序執行過程中只執行一次;代碼塊在每次創建對象時就會執行 ;
- 執行順序:靜態代碼塊→代碼塊
3.代碼分析:Math類
3.1 使用java.lang.Math類的方法時,為什么不需要new出一個Math對象,然后調用該對象上相應的方法?
Math類的構造函數:
private Math() {}
分析:由於Math類的構造函數被標記為私有,我們無法創建出Math實例。
3.2 如果new Math()會產生什么錯誤?嘗試閱讀Math類源代碼,分析原因。
錯誤信息:The constructor Math() is not visible
分析:閱讀Math類的源代碼可知Math類構造函數被標記為private;Math類中的實例變量以及方法都被標記為static,若要調用Math類中的方法,無需創建Math實例,使用Math.方法即可調用相關方法。
3.3 進一步:你覺得什么樣的對象需要new出來才能用,調用什么方法時不必創建相應對象就可以使用?(重點檢查)
- 當一個類中的方法被標記為
static時我們無需將其實例化,就可使用 - 使用類中非靜態的方法及其變量時需要將其實例化才可調用。
4. 重載Overload
4.1 什么是重載?什么是構造函數重載?怎么才能區分兩個重載的方法?
重載:在類中允許出現具有相同名稱的方法,這些方法必須滿足其參數各不相同。主要用於創建同一方法的不同版本,以便調用。
構造函數重載:提供了多種創建對象方式
區分方法:根據參數的類型及個數
4.2 在java.lang.Math類中舉出1個方法重載的例子?
public static int min(int a, int b) {
return (a <= b) ? a : b;
}
public static long min(long a, long b) {
return (a <= b) ? a : b;
}
public static void main(String[] args) {
int a=Math.min(10, 5);
double b=Math.min(0.3, 0.2);
System.out.println(a);
System.out.println(b);
}
Math類中的min方法允許接收多種類型的參數。
5. 代碼閱讀: final
final修飾的變量不能改變,為什么如下代碼卻可正常運行?
final int[] NUMBS= {1,2,3,4,5}; NUMBS[2] = 1;
NUMBS指向的數組對象不可改變但其對象的內容可改變。
final int[] NUMBS= {1,2,3,4,5};
NUMBS[2] = 1;
int[] temp={0,1,2};
NUMBS=temp;
此時會報錯,NUMBS被標記為final也就是它在堆上對對象的指向不可變。
6. Java8中的時間日期類:編寫函數 public static booleanisMondayToFriday()
提示:使用LocalDateTime, DayOfWeek類
- 功能:判斷今天如果是周一到周五,返回true,返回false。main函數中調用該函數,如果為true則輸出“工作日+姓名學號”,否則輸出"休息+姓名學號"。
- 截圖:關鍵代碼。
import java.time.*;
public class Date {
public static boolean isMondayToFriday() {
LocalDateTime localdatetime = LocalDateTime.now();
DayOfWeek dayofweek = localdatetime.getDayOfWeek();
System.out.println("LocalDateTime: " + localdatetime);
System.out.println("DayOfWeek: " + dayofweek);
if (dayofweek.equals("SUNDAY") && dayofweek.equals("Saturday")) {
return false;
}
return false;
}
public static void main(String[] args) {
System.out.println("Is it Monday to Friday?");
if (isMondayToFriday())
System.out.println("工作日 周文華 201621123008");
else
System.out.println("休息日 周文華 201621123008");
}
}

7. 封裝
7.1 結合PTA(形狀),請用自己的話簡單總結一下面向對象中封裝是什么意思?有何好處?
封裝:通過使用一些修飾符從而限定類中成員的作用范圍,提高代碼的復用性,使程序更具安全性。
好處:具有一定的安全性;隱藏了內部的細節,不必關心其具體實現。
7.2 和封裝有關的關鍵字有哪些?
publicprotectdefaultprivate
8. 結對編程實踐(未完成,0分)
找一個水平相近的同學完成1-2題實驗題。開始編程前,可先對內容進行討論。
寫出體驗報告,包括以下內容:1.對方姓名。2.所完成的題目。3.感想。4.照片
本周結對的對象是李天歌,我們完成的題目是7-2構造函數與初始化塊,我們采取分工合作,每個人完成一個小模塊。我們先討論好大致方向,每個人分配好具體任務,按各自的目標去完成,過程算是挺順利的。

9. 選做:Runnable Jar
我們以前編寫的程序,必須打開Eclipse或者將相應的.class文件拷貝出來在命令行下執行相應命令才能運行,如果.class文件較多且類文件中有包名,需要將完整的目錄結構及文件拷貝出來,才能運行。現在希望將Eclipse項目中的Java文件打成一個可運行的jar包,在命令行直接運行。改造題目6,使其從命令行接收參數,參數為年-月-日,如1999-09-09。最后將項目打成可運行的jar包,然后在命令行通過java -jar運行,並截圖。
package test;
import java.util.*;
public class ExportTime {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String[] str=in.nextLine().split("-");
System.out.println(String.format("%s年%s月%s日", str[0],str[1],str[2]));
}
}


3. 碼雲及PTA
3.1. 碼雲代碼提交記錄
在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然后搜索並截圖

3.2 截圖PTA題集完成情況圖



3.3 統計本周完成的代碼量

| 周次 | 總代碼量 | 新增代碼量 | 總文件數 | 新增文件數
| -------- | -----: | :----: |
| 1 | 94 | 94 | 4 | 4 |
| 2 | 665 | 665 | 25 | 25 |
| 3 | 1834 | 1834 | 30 | 30 |
可能是eclipse的workspace更換第1,2周的代碼量顯示為0,表格數據是后期補上去的。
