變數及運算子

      在〈變數及運算子〉中尚無留言

變數宣告

Java屬於強型語言,所以在使用變數之前一定要宣告其型態。變數宣告的目的,是跟系統要求一個特定大小的記憶体空間,語法如下

型態 變數名稱 [=值]

int a; //宣告
a=10; //指定值

因為宣告及指定常常伴隨發生,所以上述二行可以簡化成一行

int a=10;

若有多個同型態的變數,可以精簡如下,中間用 “,” 隔開

double length=176.5, weight=52.3;

原生資料複制

int id=10;
int saleId=id;
id=50;

上述二個變數是獨立的,將id變更為50後,saleId還是維持原來的10。

不過請注意,這只適用在原生基本資料型態而以,若是遇上物件參考那就不一樣,這點日後會討論。

變數初始化

區域變數需手動初始化,若未初始化就將之取出,會出現compile error。

物件變數及類別變數會自動初始化為預設值,如 int 為 0,float 為 0.0,char 為\0000,boolean 為 false,物件為 null。致於什麼是物件/類別變數,等進入物件導向課程即會說明。

變數命名規則

變數的命名,非常重要,在專案的開發過程,會花不少時間思考變數的名稱,甚至是修改變數名稱。所以再命名時,一定要非常謹慎小時,請務必遵循如下規則。

1. 使用匈牙利命名法 : 首字小寫, 第二個單字(含)後, 首字大寫,如  thisIsABook。這是Java的慣用法
2. 變數中間不可以有+-*/$#@等特殊符號,空格也不行。
3. 中間可以使用底線,如 this_is_a_book。這是C語言的慣用法。

4. 首字不可以為數字 : 如 2score,絕對禁止。
5. 首字可以為底線 : 如 _score,但不建議,因為在其他應用上,是屬於系統級變數。
6. 類別變數, 首字大寫 : 如 public class HelloTest。

其他注意事項

各種進位表示法

16進位 : int x=0x05fc; //加0x
8進位 : int y=071; //加 0
2進位 : int z=0b1101; //加 0b

分隔符號

自Java SE 7後,新增了底線當分隔號以方便讀取,所以底下的語法是正確的。
int a=3_000_0_0;

浮點數

float f=30.5; 此行會編譯錯誤,因為 30.5 預設是 double ,所以需寫成 30.5f(F),強制轉成 float。

近似值

double x=0.3+0.3+0.3;
System.out.println(x==0.9); 結果是 false
需改為如下
BigDecimal y=new BigDecimal(“0.3”);//請注意要用字串 “0.3”
y=y.add(y).add(y);
System.out.println(y.dobuleValue()==0.9);

 常數

不可變 : final int NUMBER_OF_MONTHS=12; 常使用全大寫,每個單字間使用 ‘_’分離

 原生資料儲存位置

static 的類別變數存放在 Global 區,區域變數存放在 Stack 記憶体區,Field 變數(物件變數)存在 Heap 區。
java_memory

特別注意一下,就算在區域或區塊中有一程式如下
String s=new String(“Hello World);
new 出的字串,物件的實体還是存放在 heap 區,但該物件的參考內容值 ~~s,則是在放在stack中

 運算子

指定運算子 =   +=    -=    *=    /=   %=   &=   |=   ^=   >>=   <<=   >>>=
算數運算子    +   –   *   /   %   ++   —
比較運算子 >   <   >=   <=   ==   !=
邏輯運算子 &&   ||
位元運算子 &   |
位移運算子 >>   <<
三元運算子  (boolean) ? express1:express2

int i=6;
int j=++i; //先加1再處理
i為7, j也是7

int i=6;
int j=i++; //先處理再加1
i為7, 但j為6

 運算子優先順序

()   ++—%   */   +-

 型態強制轉換及自動升級

數值只能指定到較大或相同的資料型態變數

隱式轉換

指定較小型態到大型態變數,會進行自動升級,比如把 int 放到 float,int 會升級成 float。

二個 int 相乘產生超出 int 的最大範圍值時,需使用 long 接收結果。

強制轉換

int num1=10, num2=20;
byte num3=(byte)(num1+num2); //需手動注意相加結果是否會超出byte

float 強制轉成 int 後,小數點全數刪除

byte, char, short 在運算前,會自動升級為 int,所以

byte b1=1, b2=3, b3;
b3=b1+b2;會出現編譯錯誤,需要強制轉換為byte才行

float f=27.9; 也會編譯錯誤,因為27.9是double,需使用27.9f

字串與數字

System.out.println(5+3+”=”+5+3);
結果為 : 8=53

原因 :
前面的 5+3 : 為數字的運算,所以先算出結果為 8,
然後為了跟字串 “=” 相結合(concat),全轉為字串 : “8=”
後面的 5+3 全都轉為字串的運算 : 8=53

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *