[Java] Absolute Java (5E) Ch3 重點整理
除了八種基本資料形態的變數 (byte short int long float double char boolean)
其他的都是reference variable
p.s. JAVA 的 reference 不是 C 的 reference !! 而是 C 的 pointer !!!
宣告常數的語法: public static final double d = 3.0;
JAVA的 local variable 一定要 initialize !! 沒有init 會錯!
這裡的 local variable "war1" 沒有初始化 而且scope裡面的變數 i 不是static所以也會錯(看不到) |
正確應寫成:
Logical是針對兩個logic判斷時計算的operator |
這兩個 if statment 都會false,但有趣的是如果a = 1,那出這個 if 之後 上面的 x 會 = 2,下面的 x 不會給值 簡單來說,& 的前後都會逐一檢查邏輯的正確性,全對才會對,所以兩件事都會做! && 比較像一道一道的閘門,前面那道過不了,就不再看下去,直接回傳false |
bitwise operator 則是對兩個數字對其每一 bit 相對應運算 |
向左位移 1 bit,數值增加兩倍,向左移 2 bit,數值增加2^2倍 |
JAVA 沒有 unsigned integer,所以預設全部當成signed來補 正數往右移動就補零,負數往右移就補1, 如此無法做到直接做到負數右移時補零的情形,C裡面可用unsigned來辦到這件事 JAVA則是另用一個新的operator >>> 來做到這件事! |
執行順序
先把 x++ 拿出來 放一邊
再看到 * --> v1 * x
然後看到 > --> (v1*x) > 125
JAVA 的 Shift Operator 都是有號的 shift (非unsigned)
也就是 Java 全部都是 signed integer 沒有 unsigned integer !!
使用 switch 在Java中 ()內只吃四種基本參數 都是<32 bit的參數
分別為 char, byte, short, int
JAVA 當中的 boolean 不同於 C 的 0 與 1 ,Java boolean一定要return true / false !!!
[觀念] statement 計算,算分號
switch (){
case xxxxx:
OOO();
XXX();
case xxxxxxx:
OOOO();
X();
default :
ABCD();
}
上例 如果從最外面看
總共一個statement --> switch
從switch { 之內 } 開始算
共有 5 個statement !!!
一組 if..else 就算一個statement
if(){
}else{
}
所以其實if ... else if ... else if ... 的由來:
使用 ?: 來轉換 if ... else
例: 將下列轉換成if ... else
解:
這可看成
精簡寫成
由右到左看!!
所有非8個基本type的全部都是pointer
JAVA當中,String是個物件
如圖 a==b會 false 的原因是因為在宣告時,a 與 b 分別指到不同的物件,就算物件裡data一樣 a == b 還是不一樣 ,所以要用物件裡的equals()來比 |
如果宣告時直接給初始值,compiler看到兩個人都指一樣的東西 會自己把它們指到同一個物件之上 所以 a == b 在這裡變成 true 了... OAO! |
如果 x 原本就沒指任何物件,則使用 equals() 裡面裝 真的存在的物件 "yes"時 會發生NullPointerException |
所以加一個判斷條件來保護它 p.s. if 判斷當中 一個& 左右兩邊都會看!有一個不對就false 兩個&&時,如果左邊的已經錯了就不看下去了直接reject! |
SideEffect
想成吃藥的副作用,正常人吃藥沒事就是沒有副作用
也就是說
執行完 一些 statement 之後,造成系統一些內部參數發生改變就是有發生
side effect !!!
在 C function裡面的傳遞參數,是pass by value所以沒有side effect
JAVA當中 只有 pass by value 沒有pass by reference
C語言裡面的pass by value,把變數 x 的值傳進去function function內的變數a會拷貝一份這個值,並且以a的身份操作 並不會影響到原本的變數 x |
C 在 call function時,會有個int *p 參數用來接,如果function之內對 p 做事情
就等同是像剛剛java String那個例子的用pointer來做pass by value,
如果是對 *p 做事情,那就是pass by reference,就會影響到原本的 *a,有side effect
而Java完全是以 pass by value 傳參數 如果真的想要pass by reference的效果,就要用物件裡面的method: getter與setter來實作它!
這是Java寫OOP觀念!
留言
張貼留言