常數顧名思義就是一個不會變動的值.
常數也有型別,常見的常數型別如下:
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