2014年8月7日 星期四

何謂常數

Java允許程式中有常數存在,通常用來運算或令值給變數.
常數顧名思義就是一個不會變動的值.
常數也有型別,常見的常數型別如下:

1.物件類: 就只有空物件常數null

2.布林類: 就只有真假兩常數true,false

3.數字類: 分成整數及浮點兩類,
3A.整數類: 凡是沒有小數點的數字一律當成int型別
                若想視為long型別,可在整數後加L.
3B.浮點類: 凡是有小數點的數字一律當成double型別
                若想視為float型別,可在浮點後加F.
                10的多少次方可用E後面加數字表示.

4.文字類: 分成字元及字串兩類,
4A.字元類: 凡是單引號夾的字元,一律當成char型別
4B.字串類: 凡是雙引號夾的字串,一律當成String型別

舉例:
  Scanner sc = null;   // 令sc值為空物件null
  boolean b=false;   // 令b值為boolean常數假
  int i = 0;      // 令i值為int常數0
  long l = 0L;    //  令l值為long常數0
  double d = 1.23e2;  // 令d值為double常數1.23*10^2,即實數123
  float f = 0.0F;   // 令f值為float常數0
  char c = 'A';    // 令c值為char常數A
  char c2 = '好';  // 令c2值為char常數好
  char c3 = '\u000d';  // 令c3值為char常數Unicode字碼\u000d,即換行字元\n
  String s = null;  // 令s值為空物件null,字串也屬物件,故可填入空物件值
  String s2 = "";  // 令s2值為String常數空字串
  String s3 = "今天天氣很好\n";  // 令s3值為String常數今天天氣很好\n

數字類常數在令值給變數時,
若遇常數值放不進變數型別範圍,或大範圍型別放入小範圍型別,
則會出現error: possible loss of precision可能丟失精準度錯誤,
這時要使用強制轉型指令,常數前加(欲轉型型別名),才能編譯過關.

舉例:
   double d = 3;    // int小範圍型別放入double大範圍型別,沒問題
   float f = 3;   // int小範圍型別放入float大範圍型別,沒問題
   long l = 3;  // int小範圍型別放入long大範圍型別,沒問題
   int i = 3;  // int型別放入int同型別,沒問題
   short s = 3;  // int大範圍型別放入short小範圍型別,本有問題,但值3本身放得進short,故無問題
   byte b = 3;  // int大範圍型別放入byte小範圍型別,本有問題,但值3本身放得進byte,故無問題
   double d2 = 3.0;  // double型別放入double同型別,沒問題
 float f2 = 3.0;  // 有丟失精準度錯誤, 3.0常數視為double型別,不能放入較小範圍float型別內
   float f2 = (float) 3.0;  // double強制轉型為float,再令值就沒問題
   int i2 = 3.0;  // 有丟失精準度錯誤, 3.0常數視為double型別,不能放入較小範圍int型別內
   int i3 = (int) 3.0;  // double強制轉型為int,再令值就沒問題

PS
1. 數字類型別範圍,由小到大,如下: (可參考課本附錄D基本型別介紹)
       byte: 8bits: -2^7=-128 ~ 127=2^7-1
       short: 16bits: -2^15=-32768 ~ 32767=2^15-1
       int: 32bits: -2^31=-2e9 ~ 2e9=2^31-1
       long: 64bits: -2^63=-9e18 ~ 9e18=2^63-1
       float: 32bits: -3.4e38 ~ -1.4e-45, 0, 1.4e-45 ~ 3.4e38
       double: 64bits: -1.7e308 ~ -4.9e-324, 0, 4.9e-324 ~ 1.7e308

2. 中英對照
常數   constant, literal
單引號  single quote
雙引號  double quote
強制轉型 type casting

沒有留言: