文章目錄
- 一、變數和型別
- 1. 整型變數
- 2. 長整型變數
- 3. 雙精度浮點型
- 4. 單精度浮點型
- 5. 字符型別變數
- 6. 位元組型別變數
- 7. 短整型變數
- 8. 布爾型別變數
- 9. 字串型別變數
- 10. 變數的作用域
- 11. 變數的命名規則
- 12. 常量
- 13. 理解數值提升
- 14. int 和 String 之間的相互轉換
- 二、運算子
- 三、 注釋
- 四、 關鍵字
- 五、 總結
一、變數和型別
在介紹下面各種型別之前我們先總的瀏覽一下有哪些型別(圖中型別,以下并沒有全部介紹,一些參考型別會在后面章節再介紹)
1. 整型變數
-
語法格式
int 變數名 = 初始值;
-
代碼示例
int num = 10; System.out.println(num); -
注意事項
-
在 Java 中,一個 int 變數占4個位元組,和作業系統沒有直接關系
-
int 型別資料范圍是 -231 ~ 231-1,也就大概是 -21億 ~ 21億
-
可以使用以下代碼查看 Java 中的整形資料范圍
System.out.println(Integer.MAX_VALUE); // int 的最大值 System.out.println(Integer.MIN_VALUE); // int 的最小值 -
如果嘗試將最大值加1的話,你會發現結果是最小值,如
System.out.println(Integer.MAX_VALUE+1); // 結果為-2147483648這其實和我在 【剖析C語言資料在記憶體中的存盤】 這章畫的 char 型別的圓形圖很像,最小值減1就變成了最大值,最大值加1就變成了最小值
-
如果你定義一個整型,初始化的值超過了 int 范圍,如2147483648,你會發現報錯,因為這是已經超出了 int 的最大范圍,但是由于編譯器不同,如果你將代碼寫成這樣,也是可能通過的
int a =2147483647 + 1; // 2147483647為 int 的最大值
-
2. 長整型變數
-
語法格式
long 變數名 = 初始值;
-
代碼示例
long num = 10L; System.out.println(num); -
注意事項
-
定義一個長整形變數,初始值后面要加 L 或 l 會更好一些
-
long 型別資料范圍是 -263 ~ 263-1
-
可以使用以下代碼查看 Java 中的長整形資料范圍
System.out.println(Long.MAX_VALUE); // long 的最大值 System.out.println(Long.MIN_VALUE); // long 的最小值
-
3. 雙精度浮點型
-
語法格式
double 變數名 = 初始值;
-
代碼示例
double num = 1.0; System.out.println(num); -
注意事項
-
在 Java 中,int 除以 int 的值任然是 int(會直接舍棄掉小數部分),如
int a = 1; int b = 2; System.out.println(a/b); // 結果為0將 int 改為 double 才能得到結果0.5
-
Java 的 double 型別的記憶體布局遵守 IEEE 754 標準(和 C 語言一樣),嘗試使用有限的記憶體空間表示可能無限的小數, 勢必會存在一定的精度誤差,我們看一段代碼
double num = 1.1; System.ou.println(num * num); // 結果為1.2100000000000002
因為 double 可以精確表示11位,而之后的數都不是精確值,總結就是,小數沒有精確值
-
雖然 Java 中的 double 是8個位元組,但是浮點數的記憶體布局和整數的差別很大,不能單純的用 2n 的形式表示資料范圍
-
可以使用以下代碼查看 Java 中的雙精度浮點型別資料范圍
System.out.println(Double.MAX_VALUE); // double 的最大值 System.out.println(Double.MIN_VALUE); // double 的最小值
-
4. 單精度浮點型
-
語法格式
float 變數名 = 初始值;
-
代碼示例
float num = 1.0f; // 也可以寫作 1.0F System.out.println(num); -
注意事項
-
float 型別的數值后有后綴 F 或 f,沒有后綴的浮點數默認為 double 型別,也可后綴 D 或 d
-
如果上述代碼數值后沒有 f,則會報錯,因為 Java 是強型別語言,1.0 默認是 double 型,等號左右型別不匹配
-
可以使用以下代碼查看 Java 中的雙精度浮點型別資料范圍
System.out.println(Double.MAX_VALUE); // double 的最大值 System.out.println(Double.MIN_VALUE); // double 的最小值 -
5. 字符型別變數
-
語法格式
char 變數名 = 初始值;
-
代碼示例
char ch = 'C'; System.out.println(ch); -
注意事項
-
在 Java 中的 char 是一個無符號的整數,為什么這么說呢,我們可以看一個代碼
char ch1 = 97; char ch2 = -7; System.out.println(ch1); // 結果為 A System.out.println(ch2); // 報錯也因此 char 型別的范圍在 0 ~ 216
-
可以使用以下代碼查看 Java 中的字符型別資料范圍
System.out.println(Character.MAX_VALUE); // char 的最大值 System.out.println(Character.MIN_VALUE); // char 的最小值而最小值對應的字符是
'\u0000',最大值對應的字符是'\uFFFF', -
在 C 語言中 char 是一個位元組,而在 Java 中 char 是兩個位元組,其表示的字符種類也更多,如有中文
-
在 C 語言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符
-
執行
javac編譯含有中文的代碼時可能報錯,因為 Java 中使用 Unicode 編碼字符,而編譯時使用的是GBK解碼,所以不能正確的將中文給編譯出來,如果編譯代碼改成這樣就可以了javac -encoding utf-8 檔案名.java
-
6. 位元組型別變數
-
語法格式
byte 變數名 = 初始值;
-
代碼示例
byte value = 0; System.out.println(value); -
注意事項
-
在 Java 中 byte 是一個位元組,故其范圍為 -128 ~ 127
-
可以使用以下代碼查看 Java 中的位元組型別資料范圍
System.out.println(Byte.MAX_VALUE); // byte 的最大值 System.out.println(Byte.MIN_VALUE); // byte 的最小值 -
大家可以判斷一下這段代碼的結果是多少
byte a = Byte.MAX_VALUE + 1; System.out.println(a);答案會像 int 型別一樣變成該型別的最小值嗎?不會,因為1是整形,占4個位元組,兩種型別計算的話都會先轉化成 int 型別,然后又被轉換為 byte 型別而丟失精度,故結果報錯
-
7. 短整型變數
-
語法格式
short 變數名 = 初始值;
-
代碼示例
short a = 0; System.out.println(a); -
注意事項
-
可以使用以下代碼查看 Java 中的短整型型資料范圍
System.out.println(Short.MAX_VALUE); // short 的最大值 System.out.println(Short.MIN_VALUE); // short 的最小值
-
8. 布爾型別變數
-
語法格式
boolean 變數名 = 初始值;
-
代碼示例
boolean value = true; System.out.println(value); -
注意事項
- boolean 型別的變數只有兩種取值,true 表示真,false 表示假
- Java 的 boolean 型別和 int 不能相互轉換,不存在 非0 表示 true, 0 表示 false 這樣的用法
- JVM 規則下,沒有明確 boolean 型別的大小,有些書里表明是占1個位元組, 有些表明是占1個位元位
9. 字串型別變數
-
語法格式
String 變數名 = “初始值”;
-
代碼示例
String name = "LiXiaoBo"; System.out.println(name); -
拼接用法
- 拼接:字串和任意型別的資料,使用 “+” 號拼接后,其結果也是字串,如
int a = 10; System.out.println("a = " + a);再看一個代碼
int a = 10; int b = 20; System.out.println("ab = " + a + b);這個結果為 `ab = 1020` ,但是我再將代碼改一下是多少呢?int a = 10; int b = 20; System.out.println(a + b + "= ab");結果為
30 = ab,所以要注意,只有字串在前面時,才能直接拼接,不然可能會先進行其他運算- 如果字串里有特殊字符,則需要加上轉義符號,如
String str = "hello \"吞吞吐吐大魔王\""; System.out.println(str);大家可以看一下特殊的轉義字符有哪些
特殊字符的轉義序列 轉義序列 名稱 Unicode 值 \b 退格 \u0008 \t 制表 \u0009 \n 換行 \u000a \r 回車 \u000d \ ‘’ 雙引號 \u0022 \ ’ 單引號 \u0027 \ \ 反斜杠 \u005c -
注意事項
String 的型別其實與上面的內置型別不一樣,它其實是參考型別,因為它所定義的變數叫做參考變數,按照示例代碼,參考變數 name 里面存放的不是字串
"LiXiaoBo",而是將字串所占的那片空間的地址存放在 name 里面
10. 變數的作用域
和 C 語言類似,在 java 中,變數的作用域就是該變數能生效的范圍,一般時變數定義所在的代碼塊內(相鄰大括號中)
11. 變數的命名規則
-
硬性指標
- 一個變數名只能包含數字、字母、下劃線
- 數字不能開頭
- 雖然語法上允許使用中文/美元符($)命名變數,但是不推薦
-
推薦
- 變數名使用小駝峰命名法
- 類名使用大駝峰命名法
以上簡介了簡單的、實用的命名規則,如果想知道在 java 中具體命名的一些規則,可以瀏覽 第三章 Java的基本程式設計結構(1) 我寫的這篇《Java 核心技術卷I》的閱讀筆記里的內容
12. 常量
概念
常量指的是運行時型別不能發生改變,主要有一下兩種體現形式
-
字面常量
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 關鍵字修飾的常量
- 在 Java 中,利用關鍵字 final 指示常量,如
final double CM_PER_INCH=2.54;-
關鍵字 final 表示這個常量只能被賦值一次,不可更改
-
習慣上,常量名使用全大寫
-
final 還可以修飾函式(密封方法),還可以修飾類(密封類),后期會詳細的介紹
13. 理解數值提升
如果大家對于型別轉換與強制型別的使用有疑惑,可以直接去瀏覽 第三章 Java的基本程式設計結構(1) 我寫的這篇《Java 核心技術卷I》的閱讀筆記里的內容,而這里我則舉一些例子有助你更好的理解,如
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
這個如果編譯其實會報錯,為什么呢?因為 a 和 b 雖然都是 byte 型別,但是計算時會先將 a 和 b 都提升成 int 型別再進行計算,得到的結果也是 int 型別,然后賦值給 c 當然會報錯,修改成這樣就可以
byte a = 10;
byte b = 20;
byte c = (int)(a + b);
System.out.println(c);
由于計算機的 CPU通常是按照4個位元組為單位從記憶體中讀寫資料,所以對于 byte 和 short 這種低于4個位元組的型別,計算時我們要格外注意,因為他們會通常先提升為 int 型別
14. int 和 String 之間的相互轉換
-
int 轉換成 String
-
法一
int num = 10; String str1 = num + ""; -
法二
int num = 10; String str2 = String.valueOf(num);
-
-
String 轉換成 int
-
法一
String str = "100"; int num = Integer.parseInt(str); -
法二
String str = "100"; int num = Integer.valueOf(str);
-
二、運算子
在 java 中基本運算都和 C 語言中差不多,以下介紹一些不一樣或者是特殊的情況
-
% 表示取余,不僅可以對 int 求模,也能對浮點型別求模,如
System.out.println(1.4%2); // 結果為 1.4 -
對于復合運算子,如 +=、-=、*=、/=、%= 等等,使用它們時,對于 byte 和 short 這種低于4個位元組的型別,就不需要擔心型別的問題,因為它會幫你自動進行型別的轉換,如
short a = 10; a = a + 20; System.out.println(a);這種情況編譯就會報錯,因為計算時 short 型別會先提升為 int 型別,但是如果使用增量運算子,就沒有這種情況
short a = 10; a += 20; System.out.println(a); -
& 和 | 如果運算元為 boolean 的時候,也表示邏輯運算,但是它們不支持短路運算
-
在使用位運算子時,我們不僅要知道十進制與二進制的快速轉化,還要知道八進制、十六進制和二進制的快速轉換
- 十六進制轉二進制:一個十六進制數字對應4個二進制位,如
int a = 0xf1; // f 轉換成4個二進制位為 1111 // 1 轉換成4個二進制位為 0001 // 0xf1 的二進制位為 11110001- 八進制轉二進制:一個八進制數字對應3個二進制位,如
int a = 072; // 7 轉換成3個二進制位為 111 // 2 轉換成4個二進制位為 010 // 072 的二進制位為 111010 -
在 Java 中,移位運算子多了一個 >>> 符號,它叫做無符號右移,它與 >> 右移運算子不同的是,它右移時,高位補0,而 >> 運算子右移時,高位補符號位
并且移位運算子我們需要知道下面的規律
- 左移 n 位,相當于原數字乘以 2n
- 右移 n 位,相當于原數字除以 2n
三、 注釋
Java 中的注釋主要分以下三種
- 單行注釋:// 注釋內容
- 多行注釋:/* 注釋內容 */ (不推薦)
- 檔案注釋:/** 檔案內容 */ (常見于方法和類之上描述方法和類的作用,可用來自動生成檔案)
注意
在使用注釋時,如果注釋內容里包括轉義字符可能會出現錯誤,如
// /u000a is a newline這是由于
- Unicode 轉義序列會在決議代碼之前得到處理
\u000a的含義是換行符,故該陳述句后面的內容都換到下一行了,如果轉義字符超過自己的數值范圍,也會報錯,
快捷鍵(注釋和取消注釋一樣)
行注釋:Ctrl + /
塊注釋:Ctrl + Shift + /
四、 關鍵字
關鍵字是 Java 中一些具有特定含義的單詞,并且我們定義的變數名不能和關鍵字沖突,
我們先簡單瀏覽 Java 中有哪些關鍵字吧!
| 用于定義訪問權限修飾符的關鍵字 | private | protected | public | ||
| 用于定義類、函式、變數修飾符的關鍵字 | abstract | final | static | synchronized | |
| 用于定義類與類之間關系的關鍵字 | new | this | super | instanceof | |
| 用于例外處理的關鍵字 | try | catch | finally | throw | throws |
| 用于包的關鍵字 | package | import | |||
| 其他修飾符關鍵字 | native | strictfp | transient | volatile | assert |
五、 總結
我的 Java 學習之旅已經開始啦!果然 C 語言學好了,再開始學習其他語言時會很舒服,希望自己繼續努力,并且可以在學習的時候找到一種更加高效、專注的學習狀態,也希望我的學習記錄能給大家帶來識訓,奧里給!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292933.html
標籤:java
