《Java程式設計》第二次學習總結
2018.12.15 《Java程式設計》第二次學習總結
教材學習內容總結
JAVA Fundations : 資料結構。
- 看完了第三章和第四章。知道了new運算子的作用是:返回新建立的物件的Reference(地址)。
接下來重點說一下自己對於關於Reference的相關理解。- Refer的英文解釋是:
Reference的英文解釋之一是:
綜上,reference就是我們通常理解的”地址“,從這個地址中我們能得到我們感興趣的資訊。通常來說這個產生了這個reference就產生了一個物件,這個reference就是物件的”身份證號碼“。結合之前的思考,個人覺得”物件“就是一間房子。即:物件=房子。
所以,reference就是這個房子的一個編號(地址),代表它的位置在哪裡。注意區分reference和reference name的區別,如:House 419 = new House();
這個例子中,reference name就是419,reference是 new House();所產生的值。中文翻譯時,reference name為引用變數,我個人認為就是一個變數,上篇隨筆中說到:變數是門牌號,這裡這個所謂的“引用變數”(就是一個變數)也就是"門牌號"。
接下來,介紹在Java學習筆記中4.1.3節中的物件的指定與相等性。
Java中有兩大型別系統:
一類是基本型別(Primitive Type),主要包括:整數,浮點數,字元,布林,位元組,這五種型別。注意不包括字串。
第二大類是“類型別”(Class Type)也被稱為參考型別(Reference Type)。我個人理解,該型別就是自己定義的型別。
對於基本型別,“=”和“==”就是C語言裡的意思,進行賦值與比較是否相等。
對於自定義的型別,“=”是用在將某個名牌綁到某個物件,而“==”是用在比較兩個名牌是否綁到了同一個物件。
結合自己的理解,物件是房子。則:“=”就是一個把“門牌號”貼到房子的過程,而“==”是一個比較兩個門牌號是否是貼在同一個房子。如:
House a = new House("0.1"); House b = new House("0.1"); System.out.println(a==b); //結果為假 System.out.println(a.equals(b)); //結果為真
程式中 a==b 就是在問,貼a門牌號的那座房子是不是貼b門牌號的那座房子?答案:不是(因為兩座房子的地址不可能一樣)。
程式中 a.equals(b) 就是在問,貼a門牌號的那座房子裡”住著的“數值與貼b門牌號的那座房子裡”住著的“數值相等嗎?即:是否內含的數值相等?答案:是(都是0.1)。
注意,在計算機的世界裡,一個房子可以有兩個門牌號噢。即:多個引用變數可以指向同一個物件。
其實,從記憶體的底層的角度來看,基本型別的數值是直接存放在它的門牌號對應的房子裡的(即:棧中)。而類型別的數值以及方法不是直接存放在它的門牌號對應的房子裡的,門牌號對應的房子裡放著的是實際數值所在的地址(在“堆”中),即:在門牌號(419)對應的房子裡(新區419)的放著一張紙條:“要找我去老區515西”。我個人理解為:物件是一個很複雜的型別了,原來簡單的那個房子不能很好的讓這個物件繼續待下去,所以這個物件搬去了一個能夠很好描述它的地方,即:老區。但是,為了能讓其他人也能從老區找到人,所以在新區的房子裡也放著一張紙條來寫物件實際所在的地址。 (新區的大一大二的學生學的東西都基本一樣:高數,線代,概率論,英語...,但是,到了大三,不同專業的學生要學的東西開始複雜起來了,所以不住新區419了,得搬去老區515,為了更好的學習複雜的知識了,我們的知識從大一的簡單變得不那麼簡單了。)
- Math類的所有方法都是靜態的,即:可以通過類名Math來呼叫方法。
- NumberFormat和DecimalFormat類看用於對資訊進行格式化。
- 含有‘+’和‘-’的識別符號是非法的,因為這兩個字元是非法的。
- 包裝類:將基本型別值“包裝”為一個物件,如:Int,Double...(從這個包裝類也表明了:Java中存在這兩大型別,且管理這兩類的資料的方式是不同的。基本型別的方式是:直接存放的是基本資料的值,而類型別的管理方式是:存放的是物件的引用(實際住的地方在哪裡)。)
- 自動包裝:自動將基本資料型別轉換為對應的包裝類,逆向的過程稱為”拆包“。
- 浮點數的比較:不能用”==“,而應該用:計算兩個浮點數的差值的絕對值,並把這個絕對值與公差(自己規定的,如:0.0001)相比較,如果絕對值小於公差,則這兩個浮點數相等,否則不等。
- 不能使用相等或關係運算符對String物件來進行比較,String物件是一個物件,不是基本型別。可以使用equals()方法來進行比較。或者compareTo()。
- 如果一個字串是一個更長的字串的字首,如:app和apply,則:短字元的順序是在長字元的前面的,即:app.compareTo(apply)<=0
- 程式是穩健的是指:程式能未卜先知,儘可能處理它所會可能遇到的各種問題。
- 迭代器物件有方法:hasNext(),next()
- 迴圈變數的建立、檢查、修改都是在for迴圈頭中完成的,迴圈控制變數可以用在迴圈體中。
- 如果一個物件實現了Iterable介面,則可以使用變形的for迴圈來處理每一項,即:for-each語句。注意:Scanner類沒有實現Iterable介面,所以不能用for-each語句。for-each的語法格式如下:
for(宣告迴圈變數:陣列的名字)
{...}
其中,宣告的迴圈變數的型別必須和陣列的型別相同。可以將這種形式的for語句翻譯成:迴圈變數i依次取陣列中的每一個元素的值。
教材學習中的問題和解決過程
無
程式碼除錯中的問題和解決過程
做了pp33,pp35,pp38
問題1:編寫pp33時遇到了邏輯錯誤,即:程式碼不是按照我想的那樣跑,它是按照我寫的那樣跑的。會出現兩位數的情況,不合題意。經過修改後解決了這個問題。其實就是,我現在一開始的寫法會有:0.092這種情況出現,而且“###”並不會把最開始的0也算成一個數字“#”
問題1解決方案:既然知道了“###”,那就直接用整數吧,不用浮點數了。這樣就可以避免0.092的情況了,一開始之所以用浮點數是因為想要有092這樣的數字出現,但是好像沒有按照我的想法:最開始的0也算數字。所以用直接規定範圍的整數來實現,但是不知道這樣的程式設計會不會出現我相要的092的情況。
- 問題2:錯誤: 找不到或無法載入主類
問題2解決方案:路徑要對。因為,如果在程式碼裡是寫了package chapter03 這個命令的,即:打包了。那麼用JAVAC -d bin/ 編譯後會自動在bin目錄下生成一個chapter03的資料夾,裡面放著.class檔案。如下圖2所示。
圖2
所以接下來用Java來執行位元組碼檔案時,用-cp命令要注意不是-cp bin/chapter03/pp33 不是!!!而應該是:-cp bin/ package.public主類名。注意空格!所以,這裡要注意雖然tree裡面有chapter03資料夾,但是那其實不是真正普通意義上的檔案加,那是package名
rm -rf 刪除非空資料夾
程式碼託管
其他(感悟、思考等,可選)
這次作業主再一次熟悉整個流程,還鞏固了一下如果帶有包名,在執行時要加上報名字首。學到了DecimalFormat類的用法,還有Random類的用法。
同時,鞏固了,要從鍵盤讀數,則要用system.in+scanner類來實現。Scanner sc = new Scanner(System.in);
知道了找不到主類就是路徑的問題。
知道了習題並不是那本教材上的,而是另一本第八版上的。
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 20/20 | 3/3 | 無統計 | |
第二週 | 68/88 | 2/5 | 無統計 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:無統計
實際學習時間:無統計
改進情況:
(有空多看看現代軟體工程 課件
軟體工程師能力自我評價表)
參考資料
- Java程式設計與資料結構教程(第二版)
- Java學習筆記
- Java2實用教程
- Java程式設計第八版