Java 程式設計思想第四章筆記
第四章執行控制流程
程式在執行過程中控制他的世界,利用執行控制語句。 Java 使用了 C語言中的所有流程控制語句,Java中設計的關鍵字 if-else while do-while for return break 以及選擇語句 switch。 Java 中不支援 goto語句但是有類似的 goto 跳轉。
4.1true false 所有條件語句利用條件表示式的結果(真或者假) 來決定執行路徑。Java 不像是 C語言或者 c++可以用數值結果作為布林值使用。
4.2 if-else 程式中有一個靜態的整形 int變數,我知道靜態修飾的方法是靜態方法直接呼叫唯一途徑。果然要查詢了之後才能明白。 https://blog.csdn.net/oguro/article/details/53008848 連結裡面主要講的是 static 的作用。當資料或者是方法要進行共享的時候,就是用 static 修飾,他是一開始就在類中載入,(就像是 main 方法,他被 Java 虛擬機器特定識別載入使用)在記憶體中只有一份,這樣大大減少了記憶體的使用。static 修飾的變數或者是方法的訪問方式兩種,但是非靜態的只有一種(通過物件訪問) http://www.cnblogs.com/zhangkeyu/p/6657702.html 這個連結講的主要是方法的呼叫,但是他沒有講到不同類之間的情況。同一個類下面方法之間的呼叫可以組成四種可能:1.非非 2.靜靜 3.非呼叫靜 4.靜呼叫非。靜態的變數應該也是這樣的 不同的類之間的方法呼叫,情況就比較複雜了,非非用物件,非呼叫靜皆可以,靜靜可以用類,靜呼叫非,只有變數可以. 這是我自己寫的,用來測試不同類之間,靜態方法和非靜態方法對另一個類中的方法或者變數(非靜態和靜態)怎麼獲取使用情況。我在原先的基礎上將 public 類多加了一個非靜態變數i和非靜態方法noStatic()用以測試這些想法
class TestStatic {
public static void main(String[] args) { // 3.靜靜 使用物件或者是類呼叫方法和變數 IfElse ie = new IfElse(); print(ie.i); print(IfElse.result); IfElse.test(1, 3);//輸出0 print(IfElse.result); // 4.靜呼叫非,靜態方法可以用物件呼叫非靜態的變數和方法、、、 int a = new IfElse().i; new IfElse().noStatic(); }
public void noneStatic() { // 1.非非要用物件而不是類呼叫 IfElse ie = new IfElse(); print(ie.i); ie.noStatic();
// 2.非呼叫靜 可以用物件呼叫靜態的變數,但不可以呼叫靜態方法。可以用類呼叫方法和變數 IfElse ie2 = new IfElse(); print(ie.result); print(IfElse.result); IfElse.test(1, 2);
} } 以我打程式碼的經驗來講, 1.首先方法和變數最常用的是同一個類下的方法和變數的呼叫,特點是靜態變數和靜態方法可以直接被任何呼叫,但是非靜態的方法或者變數要想被同一個類下的 main()呼叫,就必須要使用到例項物件了。 2.那麼怎麼記憶不同類之間的呼叫嘞?因為不同類之間的呼叫大多都是靜態方法呼叫另一個類的方法和變數(靜態或者非靜態,四種組合),像是我做過千百遍的靜態呼叫非靜態就是一直用的物件例項(也只有這種方法),但是在呼叫靜態的就兩種都可以了 3.這些呼叫難點在於記住不同類下面,非靜態方法進行的呼叫。但是由於我們在設計的時候,經常把功能類和測試類分開寫,測試類中也只有一個叫main 的主方法,而沒有一個非靜態方法給我來試驗,所以。。。。但是未雨綢繆,現在不用的原因可能是自己寫的專案比較小,等到做大專案了可能就要用這些了。 注意:else if 並不是新的關鍵字只是 else 後面的另一個新的 if 語句。 4.3迭代 while do-while 還有 for 用來控制迴圈。 while 比 do-while 更常用的原因,for 最常用的原因都很簡單。for 中定義的變數要注意其作用域。程式這裡使用了包裝器類中的靜態方法來判斷,我看了一下方法好多。 if(Character.isLowerCase(c))//使用了 java.lang.Character 中的包裝器類
我覺得很有道理,我雖然對 C語言和 c++練習的不夠多,但是 Java 我的確感受到了他自然地程式設計風格,變數在需要的時候才定義使用,而非一開始就定義。
4.3.3 逗號操作符 逗號分隔符與之不同,分隔符顧名思義是用來分隔函式的不同引數,Java中唯一能夠用操作符的是 for 迴圈的控制表示式(初始化和步進部分)。初始化可以定義多個變數但是這些變數只能是同一型別的。
4.4Foreach 語句 Java SE5引入更簡潔的 for語句用於陣列和容器(16章和17章)。不必建立 int 變數去計數,定義一個與陣列相同型別的變數 x, 繼而將陣列中每個元素一一賦值。當然不僅是陣列,還有字串(String 類中有一個方法可以返回一個 char 陣列,這樣就可以使用 foreach 迭代了)
關於過載的問題,相同的方法名可以有不同的引數列表(不是返回值,多少,順序以及型別三個)。range()是作者自己寫的生成器,就像是 print()和 print(Object o)以及 printnb(Object o) 還有
// The new Java SE5 printf() (from C): public static PrintStream printf(String format, Object... args) { return System.out.printf(format, args); }
每次我講一個返回值為 void 放在裡面都會提示錯誤,說明 void 不是 Object 類也不是 null。 4.5return
無條件分支關鍵字如人turn,break,continue ,類似goto return 關鍵字作用:1.方法指定返回值 2.退出當前方法 如果方法有返回值,就要確保每一條路徑(這個路徑指的應該是同等地位但是根據條件有著不同走向的)有一個返回值
4.6 break 和 continue 前者是結束了整個迴圈,後者是整個迴圈的某一次迭代跳過。 我沒有想到 return 類似於 break 的效果 public static int testReturn(){ print("test 測試return 的 break 效果:"); for(int x: range(10)){ print(x); if(x==3) return 0; } return 1; }
4.7臭名昭著的 goto goto 是 Java中的保留字,但是未在 Java使用它。但有類似的東西出現,如 break 和 continue ,三者因為標籤而結緣。
我對這個不怎麼熟悉的程式進行了修改,發現了 break 和 continue 到達的位置,發現 break 和 continue 可以互相轉換。但是我還有點困惑的是 i++ 是什麼時候進行的,比如說 for 迴圈的 i++是在迴圈的某次迭代完成之後進行下一次迭代之前(更準確的說是在 for迴圈中的條件控制語句之前)。因此break inner 和 continue outer 都是要進行 i++的。
注意:Java中使用標籤的唯一理由是迴圈巢狀的存在。
4.8switch 選擇語句 根據整數表示式(整數選擇因子可以使 int 或者 char)的值,選擇路徑分支。
注意語句後邊的 break,缺失了之後會造成不可挽回的結果。
第五章有一個 enumJava se5的新特性 Int c = rand.nextInt(26) + 'a';字元能夠隱式轉換 int 型別,前面也學過(char short byte )
4.9總結: Java 語言具有的基本特性:運算,操作符優先順序,型別轉換以及選擇與迴圈