因為JAVA是一種強類型的語言,所以任何變數在宣告的時候就會賦予它一個值的類型,有哪些類型呢?
如何宣告JAVA變數?
在看類型之前先了解一下JAVA變數的結構,是由類型、變數名稱、=、值組成的:
1 | int age = 20; |
int是類型,代表這個變數是整數;age為變數名稱;20則是賦予給age的值(已經設定是int了,不能帶小數點,否則會顯示錯誤)。
或是可以拆開分成兩個步驟:先宣告變量,再賦予值:
1 | int age; |
數字
宣告數值類型除了要符合整數、小術類型,也不能超出數據大小範圍,可以依照需求設定變數類型。
整數
- byte (1 byte)
範圍-128~127,例如:byte myNum = 100;
- short (2 bytes)
範圍-32,768~32,767,例如:short myNum = 5000;
- int(開發常用) (4 bytes)
範圍-2,147,483,648~2,147,483,647,例如:int myNum = 100000;
- long (8 bytes)
- 範圍-9,223,372,036,854,775,808~9,223,372,036,854,775,807
- 以”L”結尾,例如:
long myNum = 15000000000L;
小數
float (4 bytes)
- 範圍3.4e−038~3.4e+038 (可到小數7位,範圍比double更大,因為精度相較不高)
- 以”f”結尾,例如:
float myNum = 5.75f;
- 如果超出小數7位,則只會取到小數第一位: 所以會造成另一個奇怪的現象,明明ff2是ff1+1的結果,但ff1和FF2卻是相等的:
1
2
3
4public static void main(String[] args){
float f1 = 5.000000003f;
System.out.println(f1); //印出5.0
}1
2
3
4
5float f1 = 123123123;
float f2 = f1+1;
System.out.println(f1); //印出 1.2312312E8
System.out.println(f2); //印出 1.2312312E8
System.out.println(f1 == f2); //印出 true
double(開發常用) (8 bytes)
- 1.7e-308~1.7e+308(可到小數15位)
- 以”d”結尾,例如:
double myNum = 19.99d;
BigDecimal
需要保持高精度的數字(例如財會系統),不適用以上兩種類型,
除了像是上面提過的f1==f2現象,還有經典題目:1
System.out.println(0.1+0.2); //印出0.30000000000000004
從這些案例來看,專案開發中需要高精度的數據必須使用BigDecimal類型,
其他
boolean (內存 1 bit,區域變數 4 bytes)
true 或 false,系統默認true數值為1,false數值為0,常用於流程控制1
2
3
4
5
6
7
8
9boolean isJavaFun = true;
if (isJavaFun){
System.out.println("Java真有趣!");
}else{
System.out.println("Java不好玩QQ");
}
//印出 JAVA真有趣!char (2 bytes)
單個字元/字母或 ASCII 值1
2
3
4
5char myGrade = 'B';
System.out.println(myGrade); //輸出B
char myGrade = '2';
System.out.println(myGrade); //輸出2可使用Unicode
在開頭加入\u,後面加上Unicode編碼就能使用Unicode調用字元1
2char c8 = '\u0025';
System.out.println(c8); // 印出 %可使用正規表示法
1
2char c9 = '\n';
System.out.println("中間有一個" + c9 + "c9喔");終端機運行結果,發現應該在同一行的文字變成兩行:
轉成ASCII值應用
不管變數名稱是什麼,只要給的值是數字,便會去尋找那個ASCII值所對應的字元:1
2
3
4char a = 65, hi = 66, c = 68;
System.out.println(a); //輸出A
System.out.println(hi); //輸出B
System.out.println(c); //輸出D錯誤示範
輸入超過一個字、空白、雙引號字串就會無法編譯,顯示錯誤1
2
3
4
5
6
7
8char myGrade = 'HI';
// error: incompatible types: String cannot be converted to char
char myName = "C";
//同上
char myAdge= '' ;
//error: empty character literal有些電腦輸入中文也會轉成亂碼無法編譯(可以檢查看看編輯器的編碼,中文是Big5,VScode預設是UTF-8,像我一開始不知道要改的時候,還以為不能打中文,附上如何更改VS Code的文字編碼的方法)
1
char myGrade = '安'; //印出 安
String不是基礎數據類型!
隨然常常都會這樣宣告字串,但String不是基礎數據類型,至於為什麼?這個以後查清楚再來寫一篇~
1 | String greeting = "Hello World"; |
作用域
一個變數的作用域為同一個class的大括號
1 | public class VariableTest { |
如果只有main class被編譯,並且被執行的話是沒有問題的,可以正常印出18,但如果連同main2一起編譯則會顯示錯誤訊息:
1 | ch2/VariableTest.java:10: error: cannot find symbol |
從錯誤訊息看得出來第8行,也就是main2的age變數是找不到的。
可以重複宣告變數嗎?
不能重複宣告
1
2
3
4
5
6
7public class VariableTest {
public static void main(String[] args){
int age = 18;
int age =20;
System.out.println(age);
}
}錯誤訊息,表示adge這個變數已經在main宣告過了:
1
2
3
4ch2/VariableTest.java:6: error: variable age is already defined in method main(String[])
int age =20;
^
1 error可以重複賦值
1
2
3
4
5
6
7public class VariableTest {
public static void main(String[] args){
int age = 18;
age =20;
System.out.println(age); //印出20
}
}順帶一提,如果沒宣告過的變數不能直接賦值
1
2
3
4public static void main(String[] args){
name =20;
System.out.println(name);
}錯誤訊息,第一則表示找不到name這個變數,第二則也表示找不到這個變數,所以不能像JavaScript一樣,把賦值這個動作直接生出變數使用,宣告是有一定格式的:
1
2
3
4
5
6
7
8
9
10ch2/VariableTest.java:6: error: cannot find symbol
name =20;
^
symbol: variable name
location: class VariableTest
ch2/VariableTest.java:7: error: cannot find symbol
System.out.println(name);
^
symbol: variable name
location: class VariableTest