[公告] Java講義7 -- 再喝咖啡, 再靠近一點 .. Java 雖然抄自 C++ 語言, 但是還是有許多改變需要注意。 * Java 的運算符號(operator)及其運算次序跟C++相同 (修正一些C/C++未規定清楚的), 且&&與||也有short cut evaluation(或稱short circuit或lazy evaluation)的特性。 * Java 沒有指標, 保留了"參考"(reference), 但是一些規定跟C++ 也不太一樣。 -- 八大原始型態(Primitive type) 的單一變數不能宣告出"參考" ==> 在C++中可以 long salary; long& pay=salary; 使pay與salary參考同位址, 再來寫 pay=38; 就如同寫 salary=38; 但是在Java中沒有辦法這樣做。 -- 事實上, 除了八大原始型態的單一變數外, 所有其它變數都是"參考", 包括八大原始型態的array(陣列)變數也都是"參考"(即陣列是object)。 -- 既然array是參考, 宣告時不能宣告它的size 例如 int x[60]; 是錯的, 只能寫 int x[]; 或 int[] x; 之後再用如 x = new int[60]; 使 x 參考到新建的 array object, 當然宣告時也可以順便new啦, 如 int x[]= new int[60]; -- 注意 int [] x, y; 相當於 int x[], y[]; -- 複習: Java中任何東東(包括原始型態)的 array 一律為 object, 只是個"reference" 就是說array和任何object宣告後並不會自動creat, 一定要用 new 才能生出來 * 注意對"參考"所做的assignment是改變"參考", 不是改變其參考的物件! -- 例如假設已有 Student 這class, Student x = new Student("張三"); Student y = new Student("李四"); y = x; // 這使 y 和 x 都參考到 "張三", 而"李四"就不見了! // 因為Java有Auto Garbage Collection的能力, "李四"所佔記憶體會被自動回收 -- 注意如上的 y=x; 是複製"參考"而已, 若你是要複製出另一份object, 必須用clone() 這method, 例如: y = x.clone(); 這樣會複製出另一個"張三", 則y和x各參考到不同的object(不同的"張三")。 * 再注意對"參考"所做的比較也只是比較"參考"本身, 不是比較其參考到的object 所以如果x, y 仍如上述的Student, 則 if(x == y) ... // 是說如果 x和y 參考到同一個 object ... -- 若是要比較其object 的內容是否相同, 須用equals() 這method, 例如: if(x.equals(y)) ... // object 之內容相同? 當然你要在其class重寫 equals() // 阿不過 String 這 class 的 equals() 已是比字串內容 * 八大原始型態(Primitive type) 都有對應的class, 如下: boolean ==> Boolean byte ==> Byte char ==> Character short ==> Short int ==> Integer long ==> Long float ==> Float double ==> Double (就是除了char對應Character還有int對應Integer外, 其它直接將第一字母大寫。) 所以必要時, 你可以將原始型態資料包裝成object (物件, 個體)。 * class, object, reference -- object(物件,物體) 是 class(類別) 的一個 Instance (範例, 案例)。 -- reference(參考)可參考到object, 有點類似指標但不是指標, 不可對它作運算。 -- 萬海歸宗: Java 程式所有Class都源自 Object (沒寫extends就是extends Object) -- base class 的reference可以參考到它所演生出的class之object -- 在super class中除了帶有final的function外, 都為 virtual(用於Polymorphism) * Class (static) variables vs. Instance variables -- class中帶有 static 的變數不附屬於任一object, 所以又稱 class 變數。 -- 注意寫法跟 C++ 不同: C++ 中寫 Student::TOTAL 表示Student這class中的TOTAL這field Java 中要寫成 Student.TOTAL (注意在此 Student 是 class) -- 不帶有static的變數使用時一定要配合object, 故稱Instance variables -- 常數就是帶有final的變數, 表示不可再被改變的變數; 不是用 const 這保留字。 * Class (static) methods vs. Instance methods -- class中帶有 static 的函數(方法)不附屬於任一object, 所以稱 class method -- 注意使用時也是要寫成ClassName.method() 而不是 C++ 的 ClassName::method() * 數學函數: java.lang.Math 這class提供很多常用的數學函數 -- 包括abs, min, max, ceil, floor, round, random, sqrt 以及三角函數等。 -- 還有PI值以及自然對數E兩個double常數(Math.PI 和 Math.E)。