02.基本語法
1.關鍵字與識別符號
1.關鍵字
2.識別符號的使用
定義:凡是自己可以起名字的地方都叫識別符號
涉及到的結構:包名、類名、介面名、變數名、方法名、常量名
2.變數的使用(重點)
1.變數的分類
按資料型別分類
詳細說明:
1.整型:byte(1位元組=8bit) \ short(2位元組) \ int(4位元組) \ long(8位元組)
① byte範圍:-128 ~ 127
② 宣告long型變數,必須以"l"或"L"結尾
③ 通常,定義整型變數時,使用int型
④ 整型的常量,預設型別是:int型
500MB 1MB = 1024KB 1KB= 1024B B= byte ? bit?
bit: 計算機中的最小儲存單位。byte:計算機中基本儲存單元。
2.浮點型:float(4位元組) \ double(8位元組)
① 浮點型,表示帶小數點的數值
② float表示數值的範圍比long還大
③ 定義float型別變數時,變數要以"f"或"F"結尾
④ 通常,定義浮點型變數時,使用double型。
⑤ 浮點型的常量,預設型別為:double
浮點型資料計算精度丟失問題
float和double資料型別的地城資料儲存結構不一樣:
計算機系統採納了所謂的浮點數表達方式。這種表達方式利用科學計數法來表達實數,即用一個尾數(Mantissa也叫有效數字 ),一個基數(Base),一個指數(Exponent)以及一個表示正負的符號來表達實數。浮點數利用指數達到了浮動小數點的效果,從而可以靈活地表達更大範圍的實數。
float:1bit(符號位),8bits(指數位),23bits(尾數位)
double:1bit(符號位),11bits(指數位),52bits(尾數位)Java中double型別的格式基本遵循IEEE 754標準。儘管數學意義上的小數是連續的,但double僅僅能表示其中的一些離散點,把這些離散點組成的集合記為S,S的大小還是有限的。如果要儲存的小數P剛好在集合S內,那麼double型別就能精確的表示P;否則double型別只能從集合S中找一個與P最近的離散點P'代替P。
對於float和double資料型別精度丟失問題,在‘Effective Java’一書中也提到:float和double只能用來做科學計算或者工程計算(why?),在商業計算中我們要用java.math.BigDecimal。如果我們需要精確計算,非要用String來構建BigDecimal不可!
剖析float型的記憶體儲存和精度丟失問題:https://www.iteye.com/blog/hxraid-504293
3.字元型:char (1字元=2位元組)
① 定義char型變數,通常使用一對'',內部只能寫一個字元
② 表示方式:1.宣告一個字元 2.轉義字元 3.直接使用 Unicode 值來表示字元型常量
4.布林型:boolean
① 只能取兩個值之一:true 、 false
② 常常在條件判斷、迴圈結構中使用
按宣告的位置分類(瞭解)
2.定義變數的格式:
資料型別 變數名 = 變數值;
或
資料型別 變數名;
變數名 = 變數值;
3.變數使用的注意點
① 變數必須先宣告,後使用
② 變數都定義在其作用域內。在作用域內,它是有效的。換句話說,出了作用域,就失效了
③ 同一個作用域內,不可以宣告兩個同名的變數
4.基本資料型別變數間運算規則
1.涉及到的基本資料型別:除了boolean之外的其他7種
2.自動型別轉換(只涉及7種基本資料型別)
結論:當容量小的資料型別的變數與容量大的資料型別的變數做運算時,結果自動提升為容量大的資料型別。
byte 、char 、short --> int --> long --> float --> double
特別的:byte,short,char之間不會相互轉換,他們三者在計算時首先轉換為int型別
說明:此時的容量大小指的是,表示數值的範圍的大和小。比如:float容量要大於long的容量
3.強制型別轉換(只涉及7種基本資料型別):自動型別提升運算的逆運算
1.需要使用強轉符:()
2.注意點:
-
強制型別轉換,可能導致精度損失。(在大轉小時)
-
java中強轉只能針對單個bean物件,陣列間不可直接強轉 eg:Object[] objs ==> String[] strs
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
4.String與8種基本資料型別間的運算
- String屬於引用資料型別,翻譯為:字串
- 宣告String型別變數時,使用一對""
- String可以和8種基本資料型別變數做運算,且運算只能是連線運算:+
- 運算的結果仍然是String型別
3.進位制的轉換
進位制轉換的介紹
第一組:
- 二進位制轉十進位制
- 八進位制轉十進位制
- 十六進位制轉十進位制
第二組: - 十進位制轉二進位制
- 十進位制轉八進位制
- 十進位制轉十六進位制
第三組 - 二進位制轉八進位制
- 二進位制轉十六進位制
第四組 - 八進位制轉二進位制
- 十六進位制轉二進位制
第一組
二進位制轉換成十進位制
八進位制轉換成十進位制
第二組
十六進位制轉換成十進位制
規則:從最低位(右邊)開始,將每個位上的數提取出來,乘以 16 的(位數-1)次方,然後求和。
案例:請將 0x23A 轉成十進位制的數
0x23A = 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570
十進位制轉換成二進位制
規則:將該數不斷除以 2,直到商為 0 為止,然後將每步得到的餘數倒過來,就是對應的二進位制。
案例:請將 34 轉成二進位制
= 0B00100010
十進位制轉換成八進位制
規則:將該數不斷除以 8,直到商為 0 為止,然後將每步得到的餘數倒過來,就是對應的八進位制。
案例:請將 131 轉成八進位制 => 0203
十進位制轉換成十六進位制
規則:將該數不斷除以 16,直到商為 0 為止,然後將每步得到的餘數倒過來,就是對應的十六進位制。
案例:請將 237 轉成十六進位制 => 0xED
第三組
二進位制轉換成八進位制
規則:從低位開始,將二進位制數每三位一組,轉成對應的八進位制數即可。
案例:請將 ob11010101 轉成八進位制
ob11(3)010(2)101(5) => 0325
二進位制轉換成十六進位制
規則:從低位開始,將二進位制數每四位一組,轉成對應的十六進位制數即可。
案例:請將 ob11010101 轉成十六進位制
ob1101(D)0101(5) = 0xD5
第四組
八進位制轉換成二進位制
規則:將八進位制數每 1 位,轉成對應的一個 3 位的二進位制數即可。
案例:請將 0237 轉成二進位制
02(010)3(011)7(111) = 0b10011111
十六進位制轉換成二進位制
規則:將十六進位制數每 1 位,轉成對應的 4 位的一個二進位制數即可。
案例:請將 0x23B 轉成二進位制
0x2(0010)3(0011)B(1011) = 0b001000111011
3.運算子
運算子是一種特殊的符號,用以表示資料的運算、賦值和比較等。
算術運算子
賦值運算子
比較運算子(關係運算符 )
邏輯運算子
位運算子
元運算子
1.算術運算子
注意點
1.如果對負數取模,可以把模數負號忽略不記,eg:5%-2=1;但被模數是負數則不可忽略。此外,取模運算的結果不一定總是整數,eg:-5%2=-1
2.對於除號“/”,它的整數除和小數除是區別的:整數之間做除法時,只保留整數部分而捨棄小數部分。
例如:int x=3510;x=x/1000*1000; x的 結果是? //1000
3.“+”除字串相加功能外,還能把非字串轉換成字串.例如: System.out.println(“5+5=”+5+5); //列印結果是? 5+5=55 ?
2.賦值運算子
符號:=
當“=”兩側資料型別不一致時,可以使用自動型別轉換或使用強制型別轉換原則進行處理。
支援連續賦值
擴充套件賦值運算子: +=, -=, *=, /=, %= (使用這些運算子,在與容量大的型別的資料計算時,原資料型別不會自動提升為容量大的資料型別)
3.比較運算子
比較運算子的結果都是boolean型,也就是要麼是true,要麼是false。
比較運算子“==”不能誤寫成“=”
instanceof只能用於引用資料型別
4.邏輯運算子
注意點:
邏輯運算子用於連線布林型表示式,在Java中不可以寫成3<x<6,應該寫成x>3 & x<6 。
“&”和“&&”的區別:
單&時,左邊無論真假,右邊都進行運算;
雙&時,如果左邊為真,右邊參與運算,如果左邊為假,那麼右邊不參與運算。
“|”和“||”的區別同理,||表示:當左邊為真,右邊不參與運算。
異或( ^ )理解:異或,追求的是“異”
5.位運算
基本規則
java 中有 7 個位運算(&、|、^、~、>>、<<和 >>>)
運算過程
算術左移<<
算術右移>> 無符號右移(邏輯右移)>>>
按位與& 按位或| 按位異或^
按位取反~
原碼、補碼、反碼
基本規則
二進位制的最高位是符號位: 0表示正數,1表示負數
正數的原碼,反碼,補碼都一樣(三碼合一)
負數的反碼=它的原碼符號位不變,其它位取反
負數的補碼=它的反碼+1,負數的反碼 = 負數的補碼 - 1
0的反碼,補碼都是O
java沒有無符號數,換言之,java中的數都是有符號的
在計算機運算的時候,都是以補碼的方式來運算和儲存的.
當我們看運算結果的時候,要看他的原碼
- Java整數常量預設是int型別,當用二進位制定義整數時,其第32位是符號位;
當是long型別時,二進位制預設佔64位,第64位是符號位 - 二進位制的整數有如下三種形式:
原碼:直接將一個數值換成二進位制數。最高位是符號位
負數的反碼:是對原碼按位取反,只是最高位(符號位)確定為1。
負數的補碼:其反碼加1。 - 計算機以二進位制補碼的形式儲存所有的整數。
正數的原碼、反碼、補碼都相同
負數的補碼是其反碼+1
為什麼使用原碼、反碼、補碼
計算機辨別“符號位”顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法.
我們知道, 根據運演算法則減去一個正數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 ,
所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了。
1 - 1 = 1 - (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補 = [0000 0000]原
byte取值區間:-127~128
-127 = 1000 0001(byte型別 最小的負數)
-1 = 1111 1111 (byte型別 最大的負數)
1 = 0000 0001
0 = 0000 0000
6.三元運算子
語法是“條件表示式?表示式1:表示式2”
使用這個演算法可以使呼叫資料時逐級篩選。
表示式:“( ) ? : ” ()中進行二元運算 ?再運算,就形成三元運算子
一般if--else可以改寫為三元表示式
4.流程控制
順序結構:程式從上到下執行
分支結構:
if-else if - else
switch-case
switch(表示式)中表達式的值必須是下述幾種型別之一:byte,short, char,int,列舉 (jdk 5.0),String (jdk 7.0);
case子句中的值必須是常量,不能是變數名或不確定的表示式值;
同一個switch語句,所有case子句中的常量值互不相同;
break語句用來在執行完一個case分支後使程式跳出switch語句塊;如 果沒break,程式會順序執行到switch結尾
default子句是可任選的。同時,位置也是靈活的。當沒匹配的case時, 執行default
迴圈結構:
for
while
do-while 先執行一次在判斷while的條件來決定是否迴圈
帶標記的for迴圈
@Test
public void test() { // i0-j0-j1-i1-j0-j1-i2-
Outerloop:
for (int i = 0; i < 10; i++) {
System.out.print("i" + i + "-");
Innerloop:
for (int j = 0; j < 2; j++) {
if (i == 2) {
break Outerloop; // 只能打斷外層的迴圈(當外層的 i = 2 時)即打斷了整個迴圈
}
System.out.print("j" + j + "-");
}
}
}
@Test
public void test1() { // i0-j0-j1-i1-j0-j1 -i2- i3-j0-j1-i4-j0-j1-i5-j0-j1-i6-j0-j1-i7-j0-j1-i8-j0-j1-i9-j0-j1-
for (int i = 0; i < 10; i++) {
System.out.print("i" + i + "-");
Innerloop:
for (int j = 0; j < 2; j++) {
if (i == 2) {
break; // 只能打斷內層的一次迴圈(當外層的 i = 2 時)
}
System.out.print("j" + j + "-");
}
}
}