20172328李馨雨《程序設計與數據結構》第四周學習總結
教材學習內容總結
第四章:編寫類
- 嘗試編寫不在java類庫中的預約義類,定義對象能夠實現的方法函數。
- 瞭解UML這種統一建模語言,學習類名、屬性(數據)、操做(方法)之間的關係。
- 學習封裝以及實現封裝的修飾符(介紹了可見性修飾符中的public和private。在UML中+表示public可見性,-表示private可見性)
- 學習了訪問器和修改器方法,訪問器爲getX,修改器爲setX。這裏的方法命名習慣將實例變量名的第一個字母大寫。
- 瞭解方法的分析,類由數據聲明和方法聲明組成,方法是一組編程語句。java程序中的方法是一個類的組成部分。方法聲明首部包括返回值類型、方法名及該方法所接受的參數的列表,構成方法體的語句則定義在由花括號定界的範圍內。
- 方法的返回值類型必須與方法聲明首部規定的返回值類型一致。
- 定義類時,一般要定義一個構造方法以輔助建立類的實例,這個構造方法經常使用於初始化與每一個對象有關的變量。構造方法沒有任何返回類型,甚至也沒有void類型。
- 調用方法時,將把實參複製給被調方法的形參。
第七章:面向對象設計
- 瞭解軟件開發活動的四個基礎過程,即肯定軟件需求,軟件設計,實現軟件設計,軟件測試。瞭解僞代碼、產品代碼、測試語句。
- 靜態變量和靜態方法,靜態變量由全部實例共享。靜態方法能夠經過類名稱來調用。main方法只能訪問靜態變量或局部變量。
- 類間關係有最基本的三種——依賴、聚合、繼承。依賴關係:一個類依賴另外一個類的狀況稱爲依賴。一個類的對象含有另外一個類的對象叫作繼承。
- this引用。this引用可用於當前正在運行的對象。this引用也經常使用於區分同名的構造方法參數和實例變量。
- java接口是一組常量和抽象方法的集合。接口不能被實例化。能夠由多個類實現同一個接口,一個類能夠實現多個接口。
- 枚舉類型是一種特殊的類,枚舉類型的值是對象,也是實例。
- 瞭解方法分解(將複雜的程序分解爲簡單的方法累計)和方法參數的傳遞方式(實參賦給形參的不一樣類型)和方法重載(使用不一樣參數表的相同方法名能夠調用多個方法)。
教材學習中的問題和解決過程
- 問題1:變量的做用域是什麼?
- 1.(〃'▽'〃)本題解答:變量的引用範圍是該變量在程序中能夠引用的區域。聲明在類級的實例變量,能夠被類中的任何方法引用。聲明在一個特定方法中的局部變量(包括形式參數),都只能被該方法引用。
- 問題2:return語句怎麼使用?爲何不能一次返回多個實際參數?
- 2.(〃'▽'〃)本題解答:方法的返回值類型必須與方法聲明首部中規定的返回值類型一致。當方法不返回任何值時,用void做爲返回值類型。一條return語句由保留字return和後續的可選表達式組成。執行return語句時,控制當即返回到調用方法,並返回表達定義式的返回值。
- 問題3:靜態變量和靜態方法有什麼區別?
3.(〃'▽'〃)本題解答:
靜態變量有兩種狀況:
靜態變量是基本數據類型,這種狀況下在類的外部沒必要建立該類的實例就能夠直接使用
靜態變量是一個引用。這種狀況比較特殊,主要問題是因爲靜態變量是一個對象的引用,那麼必須初始化這個對象以後才能將引用指向它。
所以若是要把一個引用定義成static的,就必須在定義的時候就對其對象進行初始化。php
靜態方法:與類變量不一樣,方法(靜態方法與實例方法)在內存中只有一份,不管該類有多少個實例,都共用一個方法。
靜態方法與實例方法的不一樣主要有:
靜態方法能夠直接使用,而實例方法必須在類實例化以後經過對象來調用。html
在外部調用靜態方法時,可使用「類名.方法名」或者「對象名.方法名」的形式。實例方法只能使用後面這種方式。
靜態方法只容許訪問靜態成員。而實例方法中能夠訪問靜態成員和實例成員。
靜態方法中不能使用this(由於this是與實例相關的)。
- 問題4:依賴關係和聚合關係之間的差別。
- 4.(〃'▽'〃)本題解答:依賴關係是一個類「使用」另外一個類,即一個類的方法調用另外一個類的方法。當一個類實例化另外一個對象時,就得到了該對象的訪問權。當時不太懂左邊兩句表達的意思。
依賴與聚合的區別,經過老師上課講解和找到的這篇博客,可以理解。
- 問題5:解釋一個類如何與其自身相關聯。
- 5.(〃'▽'〃)本題解答:經過一個對象來調用的方法,能夠與該對象同類型的對象做爲參數。例如:經過一個String對象調用String類的concat方法時,concat方法接受一個String對象做爲參數。
- 問題6:實現一個接口的類只能定義在那些包含接口中的方法?
6.(〃'▽'〃)本題解答:不對,儘管實現一個接口的類必須定義那些包含在接口中的方法,但在接口中能夠定義額外的方法。java
代碼調試中的問題和解決過程
問題1:剛開始在實驗課上編寫Book類以及運行程序Bookshelf時就一直錯誤不斷,並且沒有注意到老師要求的可見性修飾符的運用,老是沒法編譯成功。後來發現是對問題的理解不夠深刻。
git
- 1.(〃'▽'〃)本題解答:Book類中定義的書名、做者、出版社和版權日期都是在類中新構建的方法。因此說每次return是隻能返回一個值的,不能把全部方法通用。除了靜態類,可使用例如
public void setFaceValue(int a1,int a2)
來解決。在Book類最後的toString方法中,定義了四個輸出,所以在其驅動類中應輸入相對應的四個類型。
問題2:在作pp4.9(對沒錯就是那個PairOfDice類)時,沒有理解由兩個Die對象組成,因而本身編些了一個新類,沒有用到Die類的對象。而後編譯成功了,可是可是!驅動類型的輸出及其魔性,不只沒有將兩個隨機值相加,還在我設定的setFaceValue方法下出現了看不懂的怪東西。見下圖。
web
2.(〃'▽'〃)本題解答:抱着一絲但願和不少絲絕望(整整花了一個晚上),去請教了蔣子行同窗。通過他分析,個人那個驅動程序中隨機搖了兩次骰子,因此在下面引用時看起來不是相加值,只須要再定義兩個量,將上面第一次隨機搖出的數值記錄,而後輸出相加。而輸出的很奇怪的一串是由於我沒有使用字符串化方法,因此直接輸出了地址,這個問題須要在類中從新加上一個toString方法。
編程
問題3:在練習7.4時,出現了前所未有的大量錯誤,訂正書不少不少遍仍是本身找不到錯誤。
數據結構
- 3.(〃'▽'〃)本題解答:求助學長的幫助。得到了一個很好的經驗,就是先把虛擬機上的文件
git push
到碼雲上,而後在git pull
到idea上就能夠很快速的查找問題所在緣由了。最後僅僅是少了一個if語句下的大括號,這個問題不只僅提醒咱們在編程過程當中必定要注意格式,最爲主要的是認真理解每一小段代碼的真正含義,這樣就能夠減小很多錯誤。
- 問題4:在課堂上對老師編譯類和運行類的命令理解不透徹。老師用了
javac -d bin -cp bin/week4 src/week4/RationalTest
,當時只知道當新的驅動類編譯時,必定要將其放在同一文件夾下不然不能成功。
4.(〃'▽'〃)本題解答:在晚自習找老師答疑。老師是利用上述命令在編譯驅動型java文件時,自動按照路徑去尋找類所編譯好的class文件,也就是說,其實能夠將class文件和java文件分開,可是在使用時要利用命令搭橋。dom
上週考試錯題總結
- 問題1: In Java a variable may contain
A . a value or a reference
B . a package
C . a method
D . a class
E . any of the above
- 問題1分析和領悟:這道題正確答案是A,由於Java變量包含對類實例化(內含值和/或附加引用)的值或引用。
- 問題2:Which properties are true of String objects?
A . Their lengths never change
B . The shortest string has zero length
C . Individual characters within a String may be changed using the replace method
D . The index of the first character in a string is one
E . Only A and B are true
- 問題2分析和領悟:這道題徹底是點錯了,我本身選的也是正確答案E,不過值得好好總結。String裏面的對象一旦建立後就不能改變,字符串是不可變的。所以,字符串的長度在建立後不會改變。最短的長度字符串是"在引號之間沒有字符,因此長度是0。replace方法容許從原來的一個字符串中建立一個新的字符串,替換一些字符,可是位數不變。字符串中第一個位置的索引是0,而不是1。另外,每一個字符串的最後一個字節包含字符串末尾字符,它是低值或二進制0的字節。
- 問題3:In the StringMutation program shown in Listing 3.1, if phrase is initialized to "Einstein" what will Mutation #3 yield if Mutation #1: mutation1 = phrase.concat(".")?
A . Einstein.
B . EINSTEIN.
C . XINSTXIN.
D . einstein.
E . xinstxin.
- 問題3分析和領悟:這道題徹底是沒有仔細分析,徹底忽略了很重要的toUppercase方法,其實很簡單。如下是列舉出的String的幾個基本方法。
char charAt(int index) 返回索引處的字符。
int compareTo(String str)返回一個整型值,負值、0、正值分別表示本對象的字符串按字典順序位置先於、等於、後於str對象的字符串。
String concat(String str)返回一個本對象字符串與str對象字符串拼接後的新字符串。
boolean equals(String str)若是本對象字符串與str字符串相同(區分大小寫),返回真,不然假。
boolean equalsIgnoreCase(String str)若是本對象與str字符串相同(不區分大小寫),返回真,不然假。
int length()返回本對象字符串所包含的字符個數。
String replace(char oldchar ,char newchar)將本對象字符串用新字符串替換後,構成新字符串後返回。
String substring(int offset, int endIndex) 返回字符串中從索引offset開始、到endindex-1處的字串。
String toLowerCase()將字符串中的全部大寫字母轉換成對應的小寫字母后,返回該字符串。
String toUpperCase()將字符串中的全部小寫字母轉換成對應的大寫字母后,返回該字符串。
- 問題4: Which of the following will yield a pseudorandom number in the range [ -5, +5 ) given the following:
Random gen = new Random( );
A . gen.nextFloat( ) * 5
B . gen.nextFloat( ) * 10 - 5
C . gen.nextFloat( ) * 5 - 10
D . gen.nextInt( ) * 10 - 5
E . gen.nextInt(10) - 5
- 問題4分析和領悟: float nextFloat() 返回一個分佈在【0.0,1.0)區間的浮點隨機數。
- 問題5: Consider the following two lines of code. What can you say about s1 and s2?
String s1 = "testing" + "123";
String s2 = new String("testing 123");
A . s1 and s2 are both references to the same String object
B . the line declaring s2 is legal Java; the line declaring s1 will produce a syntax error
C . s1 and s2 are both references to different String objects
D . s1 and s2 will compare "equal"
E . none of the above
- 問題5分析和領悟: 這兩個聲明都是合法的Java。s1是一個字符串引用,它被初始化爲字符串「testing123」。s2是一個字符串引用,它被初始化爲字符串「testing 123」。注意「testing」和「123」之間的空格。因此這兩個字符串不相等。
- 問題6: The advantage(s) of the Random class' pseudo-random number generators, compared to the Math.random method, is that
A . you may create several random number generators
B . the generators in Random are more efficient than the one in Math.random
C . you can generate random ints, floats, and ints within a range
D . you can initialize and reinitialize Random generators
E . all but answer B
- 問題6分析和領悟: 隨機數字發生器的效率是同樣的。隨機生成器優於數學的優勢。隨機包含全部其餘屬性。
- 問題7:Consider the following enumeration
enum Speed { FAST, MEDIUM, SLOW };
A . The ordinal value of MEDIUM is 2
B . The ordinal value of SLOW is 1
C . The name of the Speed enumeration whose ordinal value is zero is FAST
D . The name of the Speed enumeration whose ordinal value is one is SLOW
E . None of the above
- 問題7分析和領悟:
有些時候有道的翻譯不能相信啊,同窗們,這是親身體驗啊,好吧,這道題道理是枚舉的順序值從0開始,從左到右的升序排列。
- 問題8:You may use the String replace( ) method to remove characters from a String.
- 問題8分析和領悟: replace()方法僅用其餘單個字符替換單個字符。replace()方法不會將字符添加或刪除字符串;字符串長度將保持不變。
- 問題9: If you need to import not only the top-level of a package, but all its secondary levels as well, you should write: import package..;
A . true
B . false
- 問題9分析和領悟: import語句只能用一個(通配符)來使用。若是您還須要導入整套軟件包的全部二級級別,那麼您必須明確地寫出它們:import package.A.;; import package.B.;
其餘(感悟、思考等,可選)
這周學習的內容比較繁雜,相對來講比前幾張包含面更加廣了。這章內容最啓迪個人是:不是讓咱們只去理解,而要擁有必定的動手能力。不少時候看得懂書上的示例,但在本身作的時候漏洞百出,頻頻失手。因此應當在看懂的狀況下多多練習,可能在練習中收穫的知識會更加深入,更加催人前進。至今我很真誠的說,第七章和第四章有些內容沒有徹底吃透,消化;但願在學習新內容時我能逐步加深理解並將從前遺留的種種問題統統解決。
學習進度條
目標 |
5000行 |
30篇 |
400小時 |
第一週 |
100/100 |
1/1 |
15/15 |
第二週 |
377/477 |
1/2 |
20/35 |
第三週 |
280/757 |
2/4 |
22/57 |
第四周 |
973/1730 |
1/5 |
35/92 |
參考資料
1.Java程序設計教程(第八版)
2.《Java學習筆記(第8版)》
3.藍墨雲共享班課
4.貼吧問題ide