[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 >>> 來做到這件事!
if(!(v1 * x++ > 125))

執行順序
先把 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
解法1:
所以加一個判斷條件來保護它
p.s.  if 判斷當中 一個& 左右兩邊都會看!有一個不對就false
兩個&&時,如果左邊的已經錯了就不看下去了直接reject!
解法2 (推薦)


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
JAVA 裡的String不是基本資料形態,會以pointer的形式來指
如果main當中的String變數 x 進入stack中,指到一區塊裝 "abc" data
然後call function,並把x丟入function裡面 --> f (x)
function裡面的吃一個String形態參數 a ,並且將 a 指到一區塊裝 "def"
這時stack中多了一個變數 a,由於一開始call function時f(x)使得 a 會指到 x 指的 "abc"區塊
當 a = "def" 時,並不會動到剛剛的"abc"區塊,而是再開一塊"def"指過去
而 x 還是維持原樣,指著"abc"那塊!
這就是JAVA中的 pass by value不造成side effect的詳細經過
那如果想要做到C++那種pass by reference該怎麼做呢?
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觀念!

留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[ML筆記] Ensemble - Bagging, Boosting & Stacking

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)