變數指的是程式執行時可變的量,相當於開闢一塊記憶體空間來儲存一些資料型別則是對變數的種類進行了劃分, 不同的型別的變數具有不同的特性。
基本語法格式:
int 變數名 = 初始值;
程式碼範例:
int num = 10; //定義一個整型變數
System.out.println(num);
在java中,一個int變數佔4個位元組,這和C/C++不同,和作業系統沒有直接關係。
位元組是計算機中表示空間大小的基本單位.
計算機使用二進位制表示資料. 我們認為 8 個二進位制位(bit) 為一個位元組(Byte),4個位元組表示的資料範圍是 -2^31 到 2^31-1
注意:
基本語法格式:
long 變數名 = 初始值;
程式碼範例:
long num = 10L; //定義一個長整型變數,初始值寫作10l也可以(小寫L)
System.out.println(num);
注意:
基本語法格式:
double 變數名 = 初始值;
程式碼範例:
double num = 1.1;
System.out.println(num * num)
// 執行結果
1.2100000000000002
注意:
Java 中的 double 雖然也是 8 個位元組, 但是浮點數的記憶體佈局和整數差別很大, 不能單純的用 2 ^ n 的形式表示資料範圍。
Java 的 double 型別的記憶體佈局遵守 IEEE 754 標準(和C語言一樣), 嘗試使用有限的記憶體空間表示可能無限的小數, 勢必會存在一定的精度誤差。
基本格式:
float 變數名 = 初始值;
程式碼範例:
float num = 1.0; //這樣寫是不對的,1.0預設為double型別
float num = 1.0f; // 寫作 1.0F 也可以
System.out.println(num);
注意:
float 型別在 Java 中佔四個位元組, 同樣遵守 IEEE 754 標準. 由於表示的資料精度範圍較小, 一般在工程上用到浮點數都優先考慮 double, 不太推薦float。
基本格式:
char 變數名 = 初始值;
程式碼範例:
char ch = 'A';
注意:
Test.java:3: 錯誤: 未結束的字元文字
char ch = '鍛?';
^
此時我們在執行 javac 時加上 -encoding UTF-8 選項即可
javac -encoding UTF-8 檔名.java
基本語法格式:
byte 變數名 = 初始值;
程式碼範例:
byte value = 0;
System.out.println(value);
注意:
基本語法格式:
short 變數名 = 初始值;
程式碼範例:
short value = 0;
System.out.println(value);
注意:
基本語法格式:
boolean 變數名 = 初始值;
程式碼範例:
boolean value = true;
System.out.println(value);
注意:
基本語法格式:
String 變數名 = "初始值";
程式碼範例:
String name = "zhangsan";
System.out.println(name);
注意:
// 建立一個字串 My name is "張三"
String name = "My name is \"張三\""; // \" 跳脫為雙引號
跳脫字元有很多,詳情見 常見跳脫字元
字串的 **+**操作,表示字串拼接:
//字串拼接
String a = "hello";
String b = "world";
String c = a + b;
System.out.println(c);
// 執行結果
helloworld
//還可以用字串和整數進行拼接:
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result);
// 執行結果
result = 1020
//以上程式碼說明, 當一個 + 表示式中存在字串的時候, 都是執行字串拼接行為.因此我們可以很方便的使用System.out.println 同時列印多個字串或數位
但是注意:
int a = 10;
int b = 20;
System.out.println("a+b);
//執行結果是30 而不是1020
System.out.println("a+「 」+b);
//這樣列印出來的才是a和b的值
一般就是該變數能生效的範圍,一般是變數定義所在的程式碼塊(大括號)
硬性指標:
軟性指標:
int maxValue = 100;
String studentName = "張三";
每種型別的變數也對應著一種相同型別的常數.常數指的是執行時型別不能發生改變.
常數主要有一下兩種體現形式:
1.字面值常數
10 // int 字面值常數(十進位制)
010 // int 字面值常數(八進位制) 由數位 0 開頭. 010 也就是十進位制的 8
0x10 // int 字面值常數(十六進位制) 由數位 0x 開頭. 0x10 也就是十進位制的 16
10L // long 字面值常數. 也可以寫作 10l (小寫的L)
1.0 // double 字面值常數. 也可以寫作 1.0d 或者 1.0D
1.5e2 // double 字面值常數. 科學計數法表示. 相當於 1.5 * 10^2
1.0f // float 字面值常數, 也可以寫作 1.0F
true // boolen 字面值常數, 同樣的還有 false
'a' // char 字面值常數, 單引號中只能有一個字元
"abc" // String 字面值常數, 雙引號中可以有多個字元.
2.final 關鍵字修飾的常數
final int a = 10;
a = 20; // 編譯出錯. 提示 無法為最終變數a賦值
結論:常數不能在程式執行過程中發生修改。
int 和 long/double 相互賦值:
int a=10;
long b=20;
a = b; //高型別向低型別轉換會編譯出錯,提示可能會損失精度
b = a; //低轉高 沒有問題,編譯通過
int a = 10;
double b = 1.0;
a = b; // 高型別向低型別轉換會編譯出錯,提示可能會損失精度
b = a; //編譯通過
int 和 boolean 相互賦值:
int a = 10;
boolean b = true;
b = a; // 編譯出錯, 提示不相容的型別
a = b; // 編譯出錯, 提示不相容的型別
int 字面值常數給byte賦值
byte a = 100; // 編譯通過
byte b = 256; // 超出該型別資料範圍會編譯報錯, 提示從int轉換到byte可能會有損失
結論:
int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a; //編譯出錯,提示不相容的型別
結論:
使用 變數a = (型別)變數b 的方式可以將 double 型別強制轉成 int. 但是
int 和long 混合運算:
int a = 10;
long b = 20;
int c = a + b; // 編譯出錯, 提示將 long 轉成 int 會丟失精度
int c = (long)a + b;//使用強制型別轉換,編譯通過
long d = a + b; // 編譯通過.
結論:
當 int 和 long 混合運算的時候, int 會提升成 long, 得到的結果仍然是 long 型別, 需要使用 long 型別的變數來接收結果. 如果非要用 int 來接收結果, 就需要使用強制型別轉換.
byte 和 byte 的運算:
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 編譯報錯
Test.java:5: 錯誤: 不相容的型別: 從int轉換到byte可能會有損失
byte c = a + b;
^
//正確寫法:
byte c = (byte)(a + b);
結論:
byte 和 byte 都是相同型別, 但是出現編譯報錯. 原因是, 雖然 a 和 b 都是 byte, 但是計算 a + b 會先將 a 和 b 都提升成 int, 再進行計算, 得到的結果也是 int, 這時賦給 c, 就會出現上述錯誤.由於計算機的 CPU 通常是按照 4 個位元組為單位從記憶體中讀寫資料. 為了硬體上實現方便, 諸如 byte 和 short 這種低於4 個位元組的型別, 會先提升成 int, 再參與計算。
int num = 10;
// 方法1
String str1 = num + "";
// 方法2
String str2 = String.valueof(num);
String str = "100";
int num = Integer.parseInt(str);