201621123008 《Java程序設計》 第三周學習總結


1. 本周學習總結

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

關鍵詞:類,構造函數,方法重載,方法覆蓋,封裝,繼承,多態,類被加載的過程,static,abstract,finalthis,super關鍵字等。

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

2. 書面作業

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

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

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


有理數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類構造函數被標記為privateMath類中的實例變量以及方法都被標記為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 和封裝有關的關鍵字有哪些?

  • public
  • protect
  • default
  • private

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,表格數據是后期補上去的。


免責聲明!

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



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