基於我們對C++的瞭解,下面只講解Java語言部分獨特的變量數據與運算符特性。
變量類型
範圍溢出
在 Java
中, 一個 int
變量佔4
個字節. 和操作系統沒有直接關係
- 什麼是字節?
- 字節是計算機中表示空間大小的基本單位.
計算機使用二進制表示數據. 我們認爲 8 個二進制位(bit) 爲一個字節(Byte).
平時的計算機爲 8GB 內存, 意思是 8G 個字節.
其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB.
所以 8GB 相當於 80 多億個字節.- 4 個字節表示的數據範圍是 -2^31 -> 2^31-1 , 也就約是 -21億 到 +21億.
使用以下代碼查看 Java 中的整型數據範圍:
如果運算的結果超出了 int
的最大範圍, 就會出現溢出的情況,21
億這樣的數字對於當前的大數據時代來說, 是很容易超出的. 針對這種情況, 我們就需要使用更大範圍的數據類型來表示了. Java 中提供了 long
類型.
class Test{
public static void main(String[] args){
int max = Integer.MAX_VALUE + 1;
int min = Integer.MIN_VALUE - 1;
long maxL = (long)Integer.MAX_VALUE + 1;
long minL = (long)Integer.MIN_VALUE - 1;
System.out.println(Integer.MAX_VALUE + " " + Integer.MIN_VALUE);
System.out.println(max + " " + min);
System.out.println(maxL + " " + minL);
}
}
輸出結果:
2147483647 -2147483648
-2147483648 2147483647
2147483648 -2147483649
分析:
- 第一行輸出的爲
int
類型數據的最大與最小的表示範圍。 - 第二行爲
int
類型數據溢出之後的表示值,上限加一變爲下限,下限減一變爲上限。 - 將
int
類型的上下限加一或減一仍爲int
型數據,未發生整型提升。所以將它強制轉換爲long
類型數據且用long
進行接收,如願獲得比上限大一的數據,下限亦然,因爲long
類型數據的表示範圍廣於int
類型。
長整型變量(long)注意事項:
- 基本語法格式和創建 int 變量基本一致, 只是把類型修改成 long
- 初始化設定的值爲
10L
, 表示一個長整型的數字.10l
也可以. - Java 中 long 類型佔 8 個字節. 表示的數據範圍 -2^63 -> 2^63-1
再看看long
類型的範圍:
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
輸出結果:
9223372036854775807
-9223372036854775808
這個數據範圍遠超過 int
的表示範圍,足夠絕大部分的工程場景中使用。
char 類型特色
Java 中使用 單引號 + 單個字母
的形式表示字符字面值。如char ch = 'A';
計算機中的字符本質上是一個整數. 在 C 語言中使用 ASCII
表示字符, 而 Java 中使用 Unicode
表示字符。
因此一個字符佔用2
個字節, 表示的字符種類更多, 包括中文。
char ch = '陸';
System.out.println(ch);
執行 javac 的時候可能出現以下錯誤:
Test.java:3: 錯誤: 未結束的字符文字
char ch = '鍛?';
^
這是因爲編譯涉及編碼問題,此時我們在執行 javac 時加上 -encoding UTF-8
選項即可,表示用UTF-8
的編碼格式進行編譯,可以正常輸出。
javac -encoding UTF-8 Test.java
double 類型特色
在 Java 中, int
除以int
的值仍然是 int
(會直接捨棄小數部分)。
Java 中的 double
雖然也是 8
個字節, 但是**浮點數的內存佈局和整數差別很大, **不能單純的用 2 ^ n 的形式表示數據範圍。
Java 的 double 類型的內存佈局遵守 IEEE 754
標準(和C語言一樣), 嘗試使用有限的內存空間表示可能無限的小數, 勢必會存在一定的精度誤差。
舉例:
double num = 1.1;
System.out.println(num * num);
// 執行結果
1.2100000000000002
字節類型 (byte)
Java獨特的數據類型,其基本語法格式爲:
byte 變量名 = 初始值;
代碼示例:
byte value = 0;
System.out.println(value);
注意事項:
- 字節類型表示的也是整數. 只佔
1
個字節, 表示範圍較小 (-128 ~ +127
) - 字節類型和字符類型互不相干。
布爾類型 (boolean)
不同於C++中變量是否爲0
/NULL
等的判斷方式,Java中只可以由boolean
類型變量判斷,其基本語法格式爲:
boolean 變量名 = 初始值;
代碼示例:
boolean value = true;
System.out.println(value);
注意事項:
boolean
類型的變量只有兩種取值,true
表示真,false
表示假。- boolean 類型有些 JVM 的實現是佔
1個 字節
, 有些是佔1個 比特位
, 這個沒有明確規定。 - Java 的
boolean
類型和int
不能相互轉換, 不存在像C/C++中1
表示true
,0
表示false
這樣的用法。
boolean value = true;
System.out.println(value + 1);
// 代碼編譯會出現如下錯誤:
Test.java:4: 錯誤: 二元運算符 '+' 的操作數類型錯誤
System.out.println(value + 1);
^
第一個類型: boolean
第二個類型: int
1 個錯誤
變量命名規則
硬性指標:
- 一個變量名只能包含數字, 字母, 下劃線。
- 不能以數字開頭。
- 變量名是大小寫敏感。
注意: 雖然語法上也允許使用中文/美元符($)命名變量, 但是 強烈 不推薦這樣做。
軟性指標:
- 變量命名要具有描述性, 見名知意。
- 變量名不宜使用拼音(但是不絕對)。
- 變量名的詞性推薦使用名詞。
- Java中獨特推薦變量命名爲 小駝峯命名法, 當一個變量名由多個單詞構成的時候, 除了第一個單詞之外, 其他單詞首字母都大寫。
運算符
在短路求值中我們會遇到類似於10 / 0
之類的運算, 因爲涉及除零的操作會涉及到Java中的異常機制,導致程序拋出異常,此體系之後講解,目前僅作知悉。
移位運算符 (>>>)
意爲無符號右移 。
>>>
: 最右側位不要了, 最左側補 0.
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 運行結果(按十六進制打印的)
7fffffff
取餘運算符特色 (%)
Java 中的取餘不僅針對與int
類型數據,double
類型也同樣可以使用。
System.out.println(11.5 % 2.0);
// 運行結果
1.5
小結
%
操作在 Java 中也能針對double
來計算。- 由於 Java 是強類型語言, 因此對於類型檢查較嚴格, 因此像 && 之類的運算操作數必須是
boolean
。
整體來看, Java 的運算符的基本規則和 C 語言基本一致,記住一些常見的特殊點即可常規使用。