1. 程式人生 > >20172301 2017-2018-2 《程序設計與數據結構》第4周學習總結

20172301 2017-2018-2 《程序設計與數據結構》第4周學習總結

參數 就會 info ati 性能 計算機 代碼 需求 整體

20172301 2017-2018-2 《程序設計與數據結構》第4周學習總結

教材學習內容總結

  • 第四章
  1. 類與對象的關系,類是對象的藍圖。
  2. UML類圖的使用
  3. 封裝的有關概念。(可見性修飾符:public private protected)
  4. return語句。
  5. 形參和實參
  6. 局部數據和實例數據
  • 第七章
  1. 軟件開發的步驟(確定軟件需求,軟件設計,實現軟件設計,軟件測試)
  2. 靜態變量和靜態方法
  3. 類間關系(依賴關系,聚合關系...)
  4. this的用法。常在構造方法中出現。
  5. 接口(Comparable接口,Iterator接口)
  6. 枚舉類型
  7. 有關方法設計

教材學習中的問題和解決過程

  • 問題1:書P111 return語句

    中第一句話提到了:

    在方法中聲明首部中指定的返回值類型可以是基本數據類型、類名或保留字void。

    我們經常在Java中輸入public static void main(String[] args),那麽這個void和return能否一起使用,亦或他們的區別在哪裏。

  • 問題1解決方案:於是我首先從書上了解到,方法的返回值類型必須與方法聲明首部的中規定的返回值類型一致。
    然後,我百度了返回值,參考了資料:Java中返回參數值的幾種狀態
    那麽,我們可以簡單劃分為幾類:
  1. Java中無參無返回值方法
    技術分享圖片

  2. Java 中無參帶返回值方法
    技術分享圖片

  3. Java 中帶參無返回值方法
    技術分享圖片

  4. Java 中帶參帶返回值方法


    技術分享圖片

我們書上經常使用的是無參帶返回值方法和帶參帶返回值方法。這時候,我們對於return語句的運用和有無返回值能有更系統的理解,便於後面代碼的編寫。

  • 問題2:實參和形參的理解。
  • 問題2解決方案:什麽是形式參數?什麽是實際參數?兩者之間值如何傳送?一切盡在:形參和實參的區別

書上說:

調用方法時,每個實參的值被復制後保存到相應的形參中。

就是說
形參和實參的功能是作數據傳送。發生函數調用時, 主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送。並且,這個傳送是單向的。

通俗的說
形參就是函數定義時參數表的各個變量,而實參就是調用函數時給函數的變量(寫在函數名後的圓括號裏)。

  • 問題3:什麽是偽代碼?
    在課上老師講解了代碼大致分為3種。
    1.偽代碼
    2.產品代碼
    3.測試代碼
  • 問題3解決辦法:產品代碼和測試代碼我都了解,就是平常程序中的類文件和測試文件。那麽這個偽代碼是什麽呢?假代碼嗎?並不。
    什麽叫偽代碼?
    那麽我們可以了解到,偽代碼多用於軟件設計階段,是一種簡單的計算機語言。
    例:

    if num>0 正整數
    if num<0 負整數
    else num=0

  • 問題4:Java類間關系。依賴關系和聚合關系的區別。
    如果說,聚合關系就像汽車和輪胎、引擎一樣,那麽聚合關系之間不也是存在依賴關系麽?換言之,聚合關鍵就是“有”的關系。那麽如何辨別依賴關系和聚合關系。
  • 問題4解決方案:java--依賴、關聯、聚合和組合之間區別的理解

依賴關系:
就像是一個人(Person)要買車(Car)買房(House),Person類依賴於Car類和House類的定義,因為Person類引用了Car 和 House。但是,Person類裏並沒有Car和House類型的屬性,Car 和House的實例是以參量的方式傳入到buy()方法中去的。

聚合關系:
更多體現在兩個類是處在不平等層次上的,一個代表整體,另一個代表部分。 是整體與個體之間的關系。

  • 我覺得現在應該好區分很多了。

  • 問題5:Java中的接口有什麽用?
  • 問題5解決方案: 我覺得大部分人一開始都有這個疑問吧,什麽接口?直接編寫在類中多方便。所以我覺得,接口實際上就是一種類似“規範”。所以,我從網上查閱了別人的理解和看法。
    Java 中的接口有什麽作用?
    java 接口的作用和好處
    首先,接口確實是一種規範,統一標準。

    接口就是個招牌。
    比如說你今年放假出去杭州旅遊,玩了一上午,你也有點餓了,突然看到前面有個店子,上面掛著KFC,然後你就知道今天中飯有著落了。KFC就是接口,我們看到了這個接口,就知道這個店會賣炸雞腿(實現接口)。那麽為神馬我們要去定義一個接口涅,這個店可以直接賣炸雞腿啊(直接寫實現方法),是的,這個店可以直接賣炸雞腿,但沒有掛KFC的招牌,我們就不能直接簡單粗暴的沖進去叫服務員給兩個炸雞腿了。要麽,我們就要進去問,你這裏賣不賣炸雞腿啊,賣不賣漢堡啊,賣不賣聖代啊(這就是反射)。很顯然,這樣一家家的問實在是非常麻煩(反射性能很差)。要麽,我們就要記住,中山路108號賣炸雞,黃山路45號賣炸雞(硬編碼),很顯然這樣我們要記住的很多很多東西(代碼量劇增),而且,如果有新的店賣炸雞腿,我們也不可能知道(不利於擴展)。

         反正,我的理解就是接口就是方便調用一個方法。更加的系統化。
  • 問題6:是否所有類都需要重寫toString方法。
  • 問題6解決方案:在編寫bulb類的時候呢,我輸出了一段亂碼。經過了解,因為我沒有重寫toString。那麽什麽時候應該重寫toString,toString是否是必須重寫的呢?
    學長給了我指引:

    你的對象沒有重寫這個方法的時候調用會輸出地址!你的對象需要被打印或者需以某種方式轉換為字符串時就需要重寫方法!因為你很多時候都會去做一個轉換或者打印的操作所以最好重寫一下。

           我們再看一個例子:[每個Java類都有的toString方法](https://blog.csdn.net/rocky1996/article/details/61414011)  
           那麽,我們以後最好不要偷懶想不打toString了 - _- 

代碼調試中的問題和解決過程

  • 問題1:不能編譯
    剛開始學第四章,照舊把代碼打上,然後編譯,然後運行,然後git...
    然而 技術分享圖片

              很多同學都跟我有過一樣的錯誤,我想明白是因為自己編譯的類虛擬機不能識別。那麽怎麽解決呢,我就把方法和測試代碼放在個Java文件中,可是還是不行。
  • 問題1解決方案:怎麽解決。學長給出了兩種答案。
  • 第一,同時編譯類和測試程序。 例:javac -d bin src/chap4/*
  • 第二,把類編譯到當前文件夾下。
    後來,我仔細想想就豁然開朗了。
    書P107:

    例如:Die類保存在Die.java中。

    真的需要仔細認真看書!

  • 問題2:Bulb類輸出亂碼。@665689
    一輸出看了這是啥啊,怎麽還有@,亂七八糟。
    技術分享圖片

  • 問題2解決方案:百度到了結果,這個就是內存地址。內存地址?!
    更懵了,我輸出一個代碼怎麽還會輸出內存地址
    最後,問了學長才知道是toString的問題。
    只要重寫一下toString的方法就可以了。
    所以我這時候,很認真思考了下toString的方法。
    因為我在之後又在toSring上又發生了錯誤。
    如圖:技術分享圖片

                 這個是因為沒有裝箱,轉換類型發生了錯誤。
                 所以我用了這個方法。
public String toString()    
{      
String b = Integer.toString(a);      
return b;    
}    
  • 問題3:對例7.4代碼理解問題。
    首先,構造方法時,為什麽要乘-1?
    然後,result = numerator + ""; ""這個輸出的是空??
  • 問題3的解決方法:
  • 我對第一個問題的解決辦法就是實驗。
    我考慮到-1肯定和負數有關,如果我輸入的是負數,那有什麽結果。當然,程序肯定是不會崩潰的。那麽我只要根據有無乘-1的方法進行計算即可。不得不說,我真會給自己找事情,這無疑是一個龐大的工作量。
    結果如圖: 技術分享圖片
    技術分享圖片

  • 第二個問題百思不得其解,所以問了老師。
    其實很簡單。
    numerator什麽數據類型?
    int型啊!
    result呢?
    String型啊!
    int型能直接轉換String型嗎?
    不能啊!
    所以呢,這不就懂了麽,只是轉換類型的。

代碼托管

技術分享圖片
技術分享圖片

上周考試錯題總結

  • 點算符的函數是什麽? E
    A.它可以將整數部分與浮點數的小數部分分開。
    B.它允許在給定對象的引用時訪問對象中的數據。
    C.當給定對象的引用時,它允許在對象中調用方法。
    D.它被用來終止命令(很多時候用英語來結束一個句子)
    E.B和C都是正確的。
    理解:浮點數內的點應該是一個小數點,而不是點算符。 所以A顯然是錯的

  • 如果兩個變量包含同一對象的別名。 E
    A.對象可以使用別名進行修改。
    B.除非有單獨的引用,否則不能修改對象。
    C.如果對象被修改,則創建第三個別名。
    D.如果兩個變量都設置為null,對象將變成一個“孤兒”。
    E.案A和D是正確的。
    理解:書P75指出:

    當一個對象所有的引用都丟失(可能是由於重賦值)後,它就再也不能為程序所用,即程序中不能再引用該對象的方法或使用它的變量。

         對象成為“垃圾”以後,將會被回收。
  • 字符串對象的屬性是什麽? E
    A。他們的長度永遠不會改變
    B。最短的弦是零長度。
    C。可以使用replace方法更改字符串中的單個字符。
    D。字符串中第一個字符的索引是1。
    E。只有A和B是真的。
    理解:字符串是不可變的。這意味著一旦創建了字符串對象,就不能更改它。我們不可以改變字符串,只能去創建新的字符串。

  • 如果在初始化之前嘗試使用變量,會發生什麽情況? E
    A。語法錯誤可以由編譯器生成。
    B。執行期間可能出現運行時錯誤。
    C。“垃圾”或“未初始化”值將用於計算。
    D。如果變量未初始化,則使用0值。
    E。答案A和B是正確的。
    理解:

    很多時候,編譯器能夠檢測到未初始化變量的嘗試使用,在這種情況下會產生語法錯誤。如果在編譯器中使用脫逃檢測,那麽在使用時就會出現運行時錯誤。

      所以語法錯誤和運行時錯誤都會出現。不過話說脫逃檢測是啥。  
      在網上查查唄,沒有?!那就是有道翻譯錯了,應該是可以編譯,卻不能運行。不過,我在搜索的時候竟然查到了同學的博客園,他用的也是脫逃檢測。-_-
  • 假設您編寫了一個程序,該程序使用了Random類,但是您沒有包含java.util的import語句。隨機(或java.util.*)。當您嘗試編譯和運行您的程序時會發生什麽。 B
    A。該程序不會運行,但它會對丟失的類進行警告。
    B。該程序不會編譯—您將會收到關於缺失類的語法錯誤。
    C。該程序將編譯,但您將收到關於丟失的類的警告。
    D。當程序試圖訪問隨機類的任何成員時,會遇到運行時錯誤。
    E。以上都不是
    理解:這道題我錯選了A,後來想想自己實踐時,難道他會對丟失的類進行警告?! 不會吧,只是語法錯誤而已。

  • 考慮以下兩行代碼。關於s1和s2,你能說些什麽? C
    字符串s1 = "testing" + "123";
    字符串s2 = new String(“testing 123”);
    A。s1和s2都是對同一個字符串對象的引用。
    B。聲明s2的行是合法的Java;聲明s1的行將產生語法錯誤。
    C。s1和s2都是對不同字符串對象的引用。
    D。s1和s2會比較“相等”
    E。以上都不是

理解:我能說些什麽? 真的學計算機需要細心,一個空格,失之毫厘差之千裏!

  • 這兩種設置字符串的方式產生了相同的結果: B
    a) String string = "12345"
    b) String string = 12345;
    A . true
    B . false
    理解:第二個語句不能編譯,存在關於不兼容類型的語法錯誤。從一個數字到一個字符串沒有自動轉換。而正確的應該這樣。
a) String string = new String("12345");  
b) String string = "" + 12345;  

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 122/122 1/1 20/20
第二周 487/609 1/2 18/38
第三周 482/1091 1/3 22/60
第四周 1357/2448 1/4 20/80

這周任務很重,同樣也很充實。有時候學到夜裏一點多,覺得java確實很苦,不過,任重道遠。我們應該堅持下去。

參考資料

  • Java中返回參數值的幾種狀態
  • 形參和實參的區別
  • 什麽叫偽代碼?
  • java--依賴、關聯、聚合和組合之間區別的理解
  • Java 中的接口有什麽作用?
  • java 接口的作用和好處
  • 每個Java類都有的toString方法

20172301 2017-2018-2 《程序設計與數據結構》第4周學習總結