1. 程式人生 > >Java 程式設計思想第三章筆記

Java 程式設計思想第三章筆記

                                                第三章操作符 一邊做筆記一邊看書,打程式碼更好 第六章靜態匯入是什麼?

3.1 以前我就一直覺得 System 的輸出語句太長了,作者在這裡為我完美的解決了問題,利用靜態匯入這樣在測試的時候就方便了很多。 3.2 操作符接收一個或多個引數,並生成一個新值,與普通方法呼叫有所不同。幾乎所有的操作符只能操作基本型別,例外的是= == !=能操作所有物件,String 支援+和+=。 3.3 Java 中的輸出語句中+作為字串連線的標誌,當編譯器察覺到+之後有一個非 string 型別的元素,他會嘗試把他們變成 String 型別。 3.4 在對基本型別賦值時候,基本型別儲存了實際的數值,而非是物件的引用。 對物件的賦值,會將兩個引用變成一個,另一個被覆蓋並且有垃圾回收期自動請經理,這種顯現叫做別名現象。避免別名問題的出現,就是要改變物件間的直接賦值。 而且在方法傳遞的時候,尤其要注意物件傳遞過去的引用如果在方法內發生了改變,那麼原先儲存在引用指向的物件內的資料也會發生改變,與此相較的是如果我們直接傳入的是一個數據

3.5算數操作符 學習這裡的時候發現:作者對那些什麼精度,或者溢位沒有 C語言那麼變態。我這裡的收穫主要是隨機數是怎麼產生的。這裡是用的是 java.util.Random;類中的方法,之後還有一個 java.lang.Math;類中的 Math.next 第一個還能像第二個一樣.

除了這些之外還有很多其他方法,但是除了 nextInt(int bound)能夠傳入引數之外其他都不能。基本資料型別基本都能產生 boolean int float double long 以及特殊的 byte【】陣列(沒有返回值)和 int protected 型別(我不知道留這個來幹什麼,用也用不了,而且還有其他可以替代的方法)

pseudorandom 

3.6自動遞增和遞減 注意字首形式和字尾形式的區別。 3.7關係操作符

生成一個布林結果,而我學的 C語言中是生成0或1. 大於,小於,大於等於,小於等於,等於,不等於。。。 3.7.1測試物件的等價性 等於和不等於適用於所有基本資料型別和物件,但是後者要注意,比較的是引用。 引用使用 equals()方法,這是物件繼承自 Object 父類的方法 這裡的問題要到七章的覆蓋才能解釋,到十七章才能訊息如何恰當的定義 equals() public class EqualsMethod2 {   public static void main(String[] args) {     Value v1 = new Value();     Value v2 = new Value();     v1.i=v2.i=100;     System.out.println(v1.equals(v2));//結果太令人驚奇了,為什麼   } } /* Output: false *///:~

3.8邏輯操作符 根據引數的邏輯關係生成一個布林值,與或非。經常與關係操作符一起使用。 邏輯操作符限制比較大,因為他的操作只能用於布林值,這與 C語言和 c++中有很大不同。 3.8.1短路 &&遇到一個 false   ||遇到一個 true,潛在的效能提升 3.9直接常量 存入不僅可以用十進位制表示也可以用八進位制和十六進位制,octal 和 hexadecimal 前者是零開頭後者是零 X 開頭。。     char c = 0xffff; // max char hex value  二的十六次方減一     byte b = 0x7f; // max byte hex value  二的七次方減一 (8*16-1=127)  

   short s = 0x7fff; // max short hex value 二的十五次方減一 如果我把 short s=0xffff;編譯器會自動將之轉換成 int 型別,我的 netbeans 中報錯說,int 轉換成 short 型別會損失精度

 short型別的取值範圍是:-32768---32767     Char字元型別的編碼值是:0---65535(65535加一再除以二==32768)

byte 型別:-128~ 127

在基本型別存入資料可以用字尾字元標誌型別,如用 l L 和 d D ,f F 3.9.1指數計數法 用e在 Java 中表示10,大小寫皆可以。Exponents  double expDouble = 47e47d; // 'd' is optional     double expDouble2 = 47e47; // Automatically double

3.10按位操作符 與,或,異或可以和=一起用。~不可以 對於布林值按位操作符和邏輯操作符有相同的效果,但是不會中途短路,優先考慮邏輯操作符。並且異或沒有在邏輯操作符中出現。

3.11移位操作符

1、資料在計算機底層是以二進位制來儲存的。而且就是按照資料的補碼來儲存的。(資料分為:原碼、反碼、補碼) 2、對於正數來講:原碼、反碼、補碼都是相同的。對於負數來講:其補碼可以看做是其相反數的各個位去反後,再+1得到。 在機算機中負數是以補碼形式存放的。 補碼就是取反加1.  1234567890123456(16位) -1的絕對值1 的原碼= 0000000000000001(不是說0代表的是正數嗎?) 取反 1111111111111110 加1 1111111111111111

      要注意的是自動型別轉換,如 byte short 和 char 型別在移位前會變成 int 型別的。其中最後的幾個輸出表現出了對 byte 和 short 值進行的移位運算,結果可能不正確。因為我發現在 byte 和 short 在計算機儲存的形式變成了 int 型別一共32位二進位制,但是在向右移位10之後,賦值給自己原先的型別 byte,打印出來,還是32位二進位制。明顯有問題。      原因大概是賦值給原來自己的型別時,然後再進行列印前,型別又從 byte 轉換成了 int,然後打印出了 int 轉換成 String 的字串(感覺有點不明)

3.12三元操作符 慎用,雖然更簡潔,但不容易理解

3.13字串操作符 System輸出的顯式方法,如非字串的 int 型別列印輸出,隱式轉換(一般);但是顯示轉換需要呼叫一個 Integer。toString()方法

3.14使用操作符常犯的錯誤 Java 優秀於 C語言和c++的地方,使用= 和==時候常犯的錯誤。 因為 while(x=y){}中的 x=y 結果是一個非零值,所以 C語言和 c++陷入了一個死迴圈。但是該式子在 Java 中卻不會出錯,因為在 while 或者if 這種判斷語句中的時候,編譯器期望的是一個布林值的結果,所以這裡會報錯提醒你。(除非x,y 都是布林值)

3.15型別轉換操作符 C語言和 c++中型別轉換頭疼,但是 Java 中比較安全。窄化和擴充套件轉換。基本資料型別出了布林型別之外可以相互轉換,但是類 資料型別不允許型別轉換,除了特殊方法 3.15.1截尾和舍入 Double float 變成 int,並不是我以為的擴充套件轉換,而是直接把尾巴截掉 要想得到舍入結果,必須用到 round()方法。 3.15.2提升 對基本資料型別進行算術運算或者按位運算,型別比 int 曉得 byte short char 在運算之前都會自動轉換成 int,但是如果想把結果賦值給較小的型別就要用型別轉換。就像前面的那個 byte 移位前變成了 int 型別右移了10位之後賦值給了原先的型別,結果就出現了錯誤。我在那裡比較疑惑的是,計算機在移位的時候是移動的補碼嗎? 3.16 Java 中沒有 sizeof() C語言和 c++中,其作用是為了移植,因為不同的資料型別在不同的機器上可能有不同的大小。Java 所有資料型別在所有的機器上大小是一樣的不必考慮移植

3.17操作符小結 這裡有一長串的程式碼,我還沒有看,太多了 對於 char,byte 或者 short 來說,複合複製不需要型別轉換。儘管執行型別提升,但也會獲得與直接算術運算相同的結果,另一方面更簡便?