1. 程式人生 > 其它 >02.基本語法

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種基本資料型別間的運算

  1. String屬於引用資料型別,翻譯為:字串
  2. 宣告String型別變數時,使用一對""
  3. String可以和8種基本資料型別變數做運算,且運算只能是連線運算:+
  4. 運算的結果仍然是String型別

3.進位制的轉換

進位制轉換的介紹

第一組:

  1. 二進位制轉十進位制
  2. 八進位制轉十進位制
  3. 十六進位制轉十進位制
    第二組:
  4. 十進位制轉二進位制
  5. 十進位制轉八進位制
  6. 十進位制轉十六進位制
    第三組
  7. 二進位制轉八進位制
  8. 二進位制轉十六進位制
    第四組
  9. 八進位制轉二進位制
  10. 十六進位制轉二進位制

第一組

二進位制轉換成十進位制

八進位制轉換成十進位制

第二組

十六進位制轉換成十進位制

規則:從最低位(右邊)開始,將每個位上的數提取出來,乘以 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 + "-");
        }
    }
}