變量

1. 變量和類型

變量指的是程序運行時可變的量. 相當於開闢一塊內存空間來保存一些數據.
類型則是對變量的種類進行了劃分, 不同的類型的變量具有不同的特性. 我們所討論的 “變量” 主要和我們的 “內存” 這樣的硬件設備密切相關.

1.1 整型變量(重點) 基本語法格式

//代碼示例:
int num = 10; // 定義一個整型變量 System.out.println(num) ;

注意事項:

  1. int 表示變量的類型是一個整型
  2. 變量名是變量的標識. 後續都是通過這個名字來使用變量
  3. Java 中 = 表示賦值(和數學不一樣), 意思是給變量設置一個初始值.
  4. 初始化操作是可選的, 但是建議創建變量的時候都顯式初始化.
  5. 最後不要忘記分號, 否則會編譯失敗.
  6. // 表示註釋. 註釋作爲代碼的解釋說明部分, 不參與編譯運行.
  7. 在 Java 中, 一個 int 變量佔 4 個字節. 和操作系統沒有直接關係,4 個字節表示的數據範圍是 -2^31 -> 2^31-1 , 使用以下代碼查看 Java 中的整型數據範圍:
System.out.println(Integer.MAX_VALUE); // int 的最大值 System.out.println(Integer.MIN_VALUE); // int 的最小值 

1.2 長整型變量

//代碼示例:
long num = 10L; // 定義一個長整型變量, 初始值寫作 10l 也可以(小寫的 L, 不是數字1). System.out.println(num) ;

注意事項:

  1. 基本語法格式和創建 int 變量基本一致, 只是把類型修改成 long
  2. 初始化設定的值爲 10L , 表示一個長整型的數字. 10l 也可以.
  3. 使用 10 初始化也可以, 10 的類型是 int, 10L 的類型是 long, 使用 10 L 或者 10 l 更好一些.
  4. Java 中 long 類型佔 8 個字節. 表示的數據範圍 -2^63 -> 2^63-1,使用以下代碼查看 Java 中的長整型數據範圍:
System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); 

1.3 雙精度浮點型變量

//代碼示例:
double num = 1.0;
System.out.println(num);

//代碼1:
double a = 1.0;
double b = 2.0;
System.out.println(a / b);
// 執行結果 0.5

//代碼2:
double num = 1.1;
System.out.println(num * num)
// 執行結果 1.2100000000000002

Java 中的 double 雖然也是 8 個字節, 但是浮點數的內存佈局和整數差別很大, 不能單純的用 2 ^ n 的形式表示數據範 圍.
Java 的 double 類型的內存佈局遵守 IEEE 754 標準(和C語言一樣), 嘗試使用有限的內存空間表示可能無限的小數, 勢 必會存在一定的精度誤差.

1.4 單精度浮點型變量

//代碼示例:
float num = 1.0f; // 寫作 1.0F 也可以 System.out.println(num);

注意事項:

  1. Java 中使用 單引號 + 單個字母 的形式表示字符字面值.
  2. 計算機中的字符本質上是一個整數. 在 C 語言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一
    個字符佔用兩個字節, 表示的字符種類更多, 包括中文. 使用一個字符表示一個漢字:

float 類型在 Java 中佔四個字節, 同樣遵守 IEEE 754 標準. 由於表示的數據精度範圍較小, 一般在工程上用到浮點數都 優先考慮 double, 不太推薦使用 float.

1.5 字符類型變量 基本格式:

//代碼示例:
char ch = 'A';
//使用一個字符表示一個漢字:
char ch = '呵'; System.out.println(ch);
System.out.println(ch);

注意事項:

  1. Java 中使用 單引號 + 單個字母 的形式表示字符字面值.
  2. 計算機中的字符本質上是一個整數. 在 C 語言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一個字符佔用兩個字節, 表示的字符種類更多, 包括中文
  3. 使用一個字符表示一個漢字時,執行 javac 的時候可能出現以下錯誤:
 Test.java:3: 錯誤: 未結束的字符文字 char ch = '鍛?';
^

此時我們在執行 javac 時加上 -encoding UTF-8 選項即可

javac -encoding UTF-8 Test.java`

1.6 字節類型變量

//代碼示例:
 byte value = 0;
System.out.println(value);

注意事項:
1.字節類型表示的也是整數.只佔一個字節,表示範圍較小(-128 -> +127)
2. 字節類型和字符類型互不相干.

1.7 短整型變量

//代碼示例:
 short value = 0;
System.out.println(value);

注意事項:

  1. short 佔用 2 個字節, 表示的數據範圍是 -32768 -> +32767
  2. 這個表示範圍比較小, 一般不推薦使用.

1.8 布爾類型變量

//代碼示例:
 boolean value = true;
 System.out.println(value);

注意事項:

  1. boolean 類型的變量只有兩種取值, true 表示真, false 表示假.
  2. Java 的 boolean 類型和 int 不能相互轉換, 不存在 1 表示 true, 0 表示 false 這樣的用法.
  3. boolean 類型有些 JVM 的實現是佔 1 個字節, 有些是佔 1 個比特位, 這個沒有明確規定.
boolean value = true;
System.out.println(value + 1);
// 代碼編譯會出現如下錯誤
Test.java:4: 錯誤: 二元運算符 '+' 的操作數類型錯誤
        System.out.println(value + 1);
                                 ^
第一個類型: boolean
第二個類型: int 1 個錯誤`

1.9 字符串類型變量

把一些字符放到一起就構成了字符串

//代碼示例:
String name = "zhangsan";
System.out.println(name);

注意事項:

  1. Java 使用 雙引號 + 若干字符 的方式表示字符串字面值.
  2. 和上面的類型不同, String 不是基本類型, 而是引用類型(後面重點解釋).
  3. 字符串中的一些特定的不太方便直接表示的字符需要進行轉義.

字符串的 + 操作

1.字符串拼接:

 String a = "hello";
String b = "world";
String c = a + b;

2.字符串和整數進行拼接:

System.out.println(c);
 String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result);
// 執行結果 result = 1020

以上代碼說明, 當一個 + 表達式中存在字符串的時候, 都是執行字符串拼接行爲. 因此我們可以很方便的使用System.out.println 同時打印多個字符串或數字

轉義字符示例:

 // 創建一個字符串 My name is "張三" 
 String name = "My name is \"張三\"";

轉義字符有很多, 其中幾個比較常見的如下:

轉義字符 解釋
\n 換行
\t 水平製表符
\’ 單引號
\" 雙引號
\\ 反斜槓

1.10 變量的作用域

該變量能生效的範圍, 一般是變量定義所在的代碼塊 (大括號)

class Test {
    public static void main(String[] args) {
    	{
			int x = 10;
   			System.out.println(x);// 編譯通過;
   		}
		System.out.println(x);// 編譯失敗, 找不到變量 x
	} 
}

1.11 變量的命名規則

硬性指標:

  1. 一個變量名只能包含數字, 字母, 下劃線
  2. 數字不能開頭.
  3. 變量名是大小寫敏感的. 即 num 和 Num 是兩個不同的變量.
  4. 雖然語法上也允許使用中文/美元符($)命名變量, 但是強烈不推薦這樣做.

軟性指標:

  1. 變量命名要具有描述性, 見名知意.
  2. 變量名不宜使用拼音(但是不絕對).
  3. 變量名的詞性推薦使用名詞.
  4. 變量命名推薦 小駝峯命名法, 當一個變量名由多個單詞構成的時候, 除了第一個單詞之外, 其他單詞首字母都大寫.
//小駝峯命名示例:
 int maxValue = 100;
String studentName = "張三";

1.12 常量

上面討論的都是各種規則的變量, 每種類型的變量也對應着一種相同類型的常量. 常量指的是運行時類型不能發生改變.
常量主要有以下兩種體現形式:

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 字面值常量, 雙引號中可以有多個字符.

final 關鍵字修飾的常量

final int a = 10;
a = 20; // 編譯出錯. 提示 無法爲最終變量a分配值

常量不能在程序運行過程中發生修改.

1.12 類型轉換

Java 作爲一個強類型編程語言, 當不同類型之間的變量相互賦值的時候, 會有教嚴格的校驗.
先看以下幾個代碼場景:

//int 和 long/double 相互賦值
int a = 10;
long b = 20;
a = b; // 編譯出錯, 提示可能會損失精度. b = a; // 編譯通過.
int a = 10;
double b = 1.0;
a = b; // 編譯出錯, 提示可能會損失精度. b = a; // 編譯通過.

long 表示的範圍更大, 可以將 int 賦值給 long, 但是不能將long 賦值給 int.
double表示的範圍更大, 可以將 int 賦值給 double, 但是不能將 double 賦值給 int.
結論: 不同數字類型的變量之間賦值, 表示範圍更小的類型能隱式轉換成範圍較大的類型, 反之則不行.

//int 和 boolean 相互賦值
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 字面值常量, 雙引號中可以有多個字符.

結論: int 和 boolean 是毫不相干的兩種類型, 不能相互賦值.

//int字面值常量 給 byte 賦值
byte a = 100; // 編譯通過
byte b = 256; // 編譯報錯, 提示 從int轉換到byte可能會有損失

注意: byte表示的數據範圍是 -128 -> +127, 256已經超過範圍, 而100還在範圍之內.
結論: 使用字面值常量賦值的時候, Java 會自動進行一些檢查校驗, 判定賦值是否合理.

使用強制類型轉換

int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a;// 編譯出錯, 提示不兼容的類型.

**結論:
使用 (類型) 的方式可以將 double 類型強制轉成 int. 但是

  1. 強制類型轉換可能會導致精度丟失. 如剛纔的例子中, 賦值之後, 10.5 就變成 10 了, 小數點後面的部分被忽略.
  2. 強制類型轉換不是一定能成功, 互不相干的類型之間無法強轉.**
    小結:
  3. 不同數字類型的變量之間賦值, 表示範圍更小的類型能隱式轉換成範圍較大的類型.
  4. 如果需要把範圍大的類型賦值給範圍小的, 需要強制類型轉換, 但是可能精度丟失.
  5. 將一個字面值常量進行賦值的時候, Java 會自動針對數字範圍進行檢查.

1.13 數值提升

//int 和 long 混合運算
int a = 10;
long b = 20;
int c = a + b; // 編譯出錯, 提示將 long 轉成 int 會丟失精度 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 a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);

**結論: byte 和 byte 都是相同類型, 但是出現編譯報錯. 原因是, 雖然 a 和 b 都是 byte, 但是計算 a + b 會先將 a 和 b 都 提升成 int, 再進行計算, 得到的結果也是 int, 這是賦給 c, 就會出現上述錯誤.
由於計算機的 CPU 通常是按照 4 個字節爲單位從內存中讀寫數據. 爲了硬件上實現方便, 諸如 byte 和 short 這種低於 4 個字節的類型, 會先提升成 int, 再參與計算.
小結:

  1. 不同類型的數據混合運算, 範圍小的會提升成範圍大的.
  2. 對於 short, byte 這種比 4 個字節小的類型, 會先提升成 4 個字節的 int , 再運算.**

1.14 int 和 String 之間的相互轉換

//int 轉成 String
 int num = 10;
// 方法1
String str1 = num + "";
// 方法2## 標題
String str2 = String.valueOf(num);
//String 轉成 int
String str = "100";
int num = Integer.parseInt(str);

1.15 byte和char之間的轉換

在這裏插入圖片描述在這裏插入圖片描述

1.16 小結

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章