1. 程式人生 > 其它 >20202303 實驗三 《資料結構與面向物件程式設計》實驗報告

20202303 實驗三 《資料結構與面向物件程式設計》實驗報告

# 20202303 2021-2022-1 《資料結構與面向物件程式設計》實驗三報告

課程:《程式設計與資料結構》
班級: 2023
姓名: 馬瀾
學號:20202303
實驗教師:王志強
實驗日期:2021年10月11日
必修/選修: 必修

## 1.實驗內容

1. 初步掌握單元測試和TDD

2. 理解並掌握面向物件三要素:封裝、繼承、多型

3. 初步掌握UML建模

4. 完成藍墨雲上 (1)-(5)實驗。


## 2. 實驗過程及結果

1.初步掌握單元測試和TDD

對於在IDEA上進行的單元測試,其實是有點難度的,不過在相關資料面前,按步驟去寫完成正常測試,錯誤測試與邊界測試即可,整體還是較為基礎的;

在進行TDD測試時,首先我們需要下載外掛JUnit,然後先寫好測試程式碼,再完成產品程式碼,測試用例表達了對產品程式碼的需求,只要產品程式碼可以通過測試就可以了

2.理解並掌握面向物件三要素:封裝、繼承、多型

2.1

封裝:封裝就是將資料與相關行為包裝在一起以實現資訊隱藏,既可以隱藏類的實現細節,又可以避免對類中屬性的直接操作。封裝實際上控制使用者對類的修改和訪問資料的程度,只能夠通過物件提供服務的那些方法與程式其它部分進行互動,介面是封裝的準確描述手段。簡單直白來說,封裝就是打包,將一些相關聯的資料(欄位),或是一些類似的行為(方法),打包在一起,形成一個對外獨立的隱蔽的可複用的Java類。

例子:

public class Husband {
    
    /*
     * 對屬性的封裝
     * 一個人的姓名、性別、年齡、妻子都是這個人的私有屬性
     */
    private String name ;
    private String sex ;
    private int age ;
    private Wife wife;
    
    /*
     * setter()、getter()是該物件對外開發的介面
     */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setWife(Wife wife) {
        this.wife = wife;
    }
}

封裝的主要作用:1.良好的封裝能夠減少耦合。2、類內部的結構可以自由修改。 3、可以對成員進行更精確的控制。4、隱藏資訊,實現細節。

2.2

繼承:繼承是從已有類派生一個新類的過程,通過對某一個類的繼承產生一個新的子類,子類既有從某個類中繼承下來的功能,又可以自行定義自己的變數和方法,產生新的功能。繼承是實現軟體可重用的根基,是提高軟體系統的可擴充套件性與可維護性的主要途徑,繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。也就是說,希望可以“複用程式碼”。

例子:

正如上面所說的例子,無論是丈夫還是妻子,都有共同的特點,我們可以建立人的一類,從人那裡繼承來的這些屬性和行為。

繼承的特點:1、子類擁有父類非private的屬性和方法。2、子類可以擁有自己屬性和方法,即子類可以對父類進行擴充套件。3、子類可以用自己的方式實現父類的方法。

2.3

多型:多型就是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式程式碼就可以改變程式執行時所繫結的具體程式碼,讓程式可以選擇多個執行狀態,這就是多型性。

例子:

public class Wine {
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}

public void fun2(){
System.out.println("Wine 的Fun2...");
}
}

public class JNC extends Wine{
/**
* @desc 子類過載父類方法
* 父類中不存在該方法,向上轉型後,父類是不能引用該方法的
* @param a
* @return void
*/
public void fun1(String a){
System.out.println("JNC 的 Fun1...");
fun2();
}

/**
* 子類重寫父類方法
* 指向子類的父類引用呼叫fun2時,必定是呼叫該方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}

public class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
-------------------------------------------------

多型實現條件:繼承、重寫、向上轉型。

3. 初步掌握UML建模

在UML類圖中,每個類可能包含三部分內容:類名、屬性、操作(方法)。UML類圖有屬於自己的語法,變數的型別名在變數名的後面,它們之間用冒號作為分隔符,方法的+和-表明可見性。箭頭指向,表明一個類知道並以某種方法使用另一個類(呼叫)。其中對於UML的建模需要自己去思考以及學習。

詳見雲班課測試(5)

4.完成藍墨雲上 (1)-(5)實驗。

測試結果(1)-(4)如下

(1)

(2)

(3)

(4)

## 3. 實驗過程中遇到的問題和解決過程

- 問題1:在剛開始的時候,第一次編寫Test然後由於標頭檔案是自己生成的,然後和部落格園不一樣,學著自己改,然後一直有紅色的出現
- 問題1解決方案:發現部落格園有例子檔案,謄寫上去就OK了
- 問題2:在編寫程式時,即使有時候標紅,也認舊可以pass,有的時候有黃色的標記也還是能pass,我感到很神奇。
- 問題2解決方案:最後發現執行的時候,一直都是那個成功的檔案,去標頭檔案裡選擇才能執行自己想要執行的那一個。如圖下所示

- 問題3:在對於Doc編寫時,對於各種型別的編寫其實很難下手,然後幾乎沒有想法,然後對於Long型,除完餘可能體現不出Long的優勢,所以選擇直接學號輸出
- 問題3解決方案:找了例子檔案(如下),比對著查閱書籍,尤其是Boolean類,幾乎是盲區,然後在例子檔案的支援下,勉強試出來。

- 問題4:對於UML類圖的編寫,真的不會,然後現在也仍舊不熟練,所以在此對於Doc的類編寫仍舊不得其解
- 問題4解決方案:希望後期會有答案。。

## 其他(感悟、思考等)
  這個IDEA在我一段時間的接觸中,發現其真的象老師說的那樣,大大提升了幸福度,不過由於快捷鍵帶來了便利,也帶來很多問題,我自己也是第一次使用,對於有一些方面的錯誤可能會理解不到位,而且對於有的時候那個程式一直卡著,一直顯示有錯誤一直過不了的時候會很煩躁,而且我的水平真的很一般,對於大多數問題說實在的我仍舊一知半解,但是對於IDEA的程式我第一次感覺到計算機的神奇,開始對這個未知甚至正在瞭解的程式感覺到了新奇,希望下次可以做的更好吧!
## 參考資料

- [《Java程式設計與資料結構教程(第九版)》]

-https://blog.csdn.net/weixin_33074843/article/details/114245707

-https://www.cnblogs.com/chenssy/p/3351835.html

-https://www.cnblogs.com/chenssy/p/3372798.html