< 筆記 > Java SE - 02 Java SE 語言基礎

02 Java SE 語言基礎

By Kevin Song

  • 02-01 關鍵字
  • 02-02 標識符
  • 02-03 註釋
  • 02-04 常量和變量
  • 02-05 運算符
  • 02-06 語句
  • 02-07 方法
  • 02-08 數組

02-01 關鍵字

Java裏先定義的,有特別意義的標識符。所有字母都是小寫

  • 定義數據類型的關鍵字:class, interface, byte, short, int, long, float, double, char, boolean, void.
  • 定義數據類型值的關鍵字:true, false, null.
  • 定義流程控制的關鍵字:if, else, switch, case, default, while, do, for, break, continue, return.
  • 定義訪問權限修飾符的關鍵字:private, protected, public.
  • 定義類,方法,變量修飾符的關鍵字:abstract, final, static, synchronized.
  • 定義類與類之間關係的關鍵字:extends, implements.
  • 定義建立實例,引用實例,判斷實例的關鍵字:new, this, super, instanceof.
  • 用於異常處理的關鍵字:try, catch, finally, throw, throws.
  • 用於包的關鍵字:package, import.
  • 其他修飾符關鍵字:native, strictfp, transient, volatile, assert.

02-02 標識符

程序中自定義的名稱,由26個英文字母大小寫,數字,_$組成。
規則:

  1. 數字不能開頭
  2. 不可以使用關鍵字

02-03 註釋

用於註解說明解釋程序的文字就是註釋
註釋的格式:

  1. 單行註釋:// 註釋文字
  2. 多行註釋:/註釋文字 /
  3. 文檔註釋:/*註釋文字 /

02-04 常量和變量

常量

不能改變的數值

常量分類:

  1. 整數常量:所有整數
  2. 小數常量:所有小數
  3. 布爾型常量:true false
  4. 字符常量:將一個數字字母或者符號用單引號(‘’)標識
  5. 字符串常量。將一個或多個字符用雙引號(“”)標識
  6. null常量:null

整數有四種表現形式

  • 二進制:0,1
  • 八進制:0 - 7
  • 十進制:0 - 9
  • 十六進制: 0 - 9,A - F,0x開頭。

負數的二進制表現形式

  • 對應正數二進制取反加1

變量
  • 內存中的一個存儲區域
  • 該區域有自己的名稱(變量名)和類型(數據類型)
  • 該區域的數據可以在同一類型範圍內不斷變化

定義變量的格式:變量名=初始化值


數據類型:

  1. 基本數據類型
    1. 數值型
      1. 整數類型
        1. byte 字節 8bit (-2^7^, 2^7^-1) (-128, 127)
        2. short 短整型 16bit (-2^15^, 2^15^-1) (-32768, 32767)
        3. int 整型 32bit(-2^31^, 2^31^-1)
        4. long 長整型 64bit(-2^63^, 2^63^-1)
      2. 浮點類型
        1. float
        2. double
    2. 字符型(char)(0, 65535)
    3. 布爾型(boolean)
  2. 引用數據類型
    1. 類(class)
    2. 接口(interface)
    3. 數組([ ])
//變量基本演示
public class VarDemo {
    public static void main(String[] args) {
        byte b = 3;
        short s = 4000;
        int x = 12;
        long l = 123l;

        float f = 2.3f;
        double d = 3.4;

        char ch = 'K';
        boolean bl = true;
        System.out.println(ch);
    }
}

自動類型轉換
強制類型轉換

//自動類型提升和強制轉換
public class VarDemo2 {
    public static void main(String[] args){

        int x = 3;
        byte b = 5;
        x = x + b; //b會進行自動類型提升

        byte b = 3;
        b = b + 4; //報錯,因爲4爲int。
        b = (byte)(b + 4); //結果是7。強制類型轉換
        b = (byte)(b + 200); //結果是-53

        System.out.println(b);
    }
}

字符類型運算過程

System.out.println('a'+1);
//輸出爲98
System.out.println(char('a'+1));
//輸出爲b
System.out.println(char('你'+1));
//輸出爲20321

02-05 運算符

  1. 算數運算符
    1. “ + ”
    2. “ - ”
    3. “ * ”
    4. “ / ”
    5. “ % ” 取餘,模
    6. “ ++ ” 自增,++ a先加再算,a++ 先算再加
    7. “ – ” 自減,– a先減再算,a– 先算再減
  2. 賦值運算符
    1. “ = ” 賦值
    2. “ += ” a+=1 一次賦值運算, a=a+1 一次算數運算和一次賦值運算
    3. “ -= ”
    4. “ *= ”
    5. “ /= ”
    6. “ %= ”
  3. 比較運算符(運算完的結果必須是true或者false)
    1. “ == ” 相等於
    2. “ > ” 大於
    3. “ < ” 小於
    4. “ >= ” 大於等於
    5. “ <= ” 小於等於
    6. “ != ” 不等於
    7. “ instanceof ” 檢查是否是類的對象
  4. 邏輯運算符(用於連接兩個boolean類型的表達式)
    1. “ & ” AND(與)
    2. “ | ” OR (或)
    3. “ ^ ” XOR(異或)兩邊相同則false
    4. “ ! ” NOT(非)
    5. “ && ”AND(短路)左邊爲false時,右邊不參與運算
    6. “ || ”OR (短路)左邊爲true時,右邊不參與運算
  5. 位運算符(二進制位)
    1. “ << ” 左移:左移幾位就是該數據乘以2的幾次方
    2. “ >> ” 右移:右移幾位就是該數據除以2的幾次方,高位出現的空位用原來高位的數字補
    3. “ >>> ” 無符號右移:高位用0補
    4. “ & ” 與
    5. “ | ” 或
    6. “ ^ ” 異或
    7. “ ~ ” 反碼
  6. 三元運算符:三個元素參與運算的符號

格式:(條件表達式)?表達式1:表達式2;

如果條件爲true,運算後的結果是表達式1,如果條件爲false,運算後的結果是表達式2.

02-06 語句

順序結構

按照順序從上往下執行

判斷結構

if語句

1. if(條件表達式) {  
        執行語句;  
    }
2.  if(條件表達式) {  
        執行語句;  
    } else {  
        執行語句;  
    }
3.  if(條件表達式) {  
        執行語句;  
    } else if {  
        執行語句;  
    }  
    ...  
    else {  
        執行語句;  
    }

局部代碼塊:局部代碼塊可以定義局部變量的生命週期

選擇結構

switch語句

switch(表達式) {  //byte,short,int,char.  
        case 取值1:  
        執行語句;  
        break;  
        case 取值2:  
        執行語句;  
        break;  
        ...  
        default: //永遠最後執行  
        執行語句;  
        break;  
     }

if和switch的應用

if

  • 對具體的值進行判斷
  • 對區間判斷
  • 對運算結果是boolean類型的表達式進行判斷

switch是

  • 對具體的值進行判斷
  • 值的個數通常是固定的
    對於幾個固定的值判斷,建議使用switch語句,因爲switch語句會將具體的答案都加載進內存

循環結構

當對某些代碼執行很多次時,使用循環結構。


  1. while循環
    while(條件表達式){
    執行語句;
    }
        //1到10累加
        int x = 2;
        int y = 1;
        while (x <= 10) {
            y = y + x;
            x++;
        }
        System.out.println(y);
        //1-100之間6的倍數出現的次數
        int x = 1;
        int Count = 0;
        while (x <= 100) {
            if ( x%6==0 )
                Count++;
                x++;
        }
        System.out.println(Count);

  1. do while循環//循環體至少執行一次
    do {  
    執行語句;  
} while(條件表達式);

  1. for循環
for(初始化表達式; 循環條件表達式; 循環後的操作表達式){  
        執行語句;
    }

for和while的特點:

  1. for和while可以互換。
  2. for中的變量只能在for循環中有效。

無限循環的簡單形式

// while(true) {}  

//for(;;) {}
  • for循環嵌套
for(初始化表達式; 循環條件表達式; 循環後的操作表達式) {  
    for(初始化表達式;循環條件表達式;循環後的操作表達式) {  
        執行語句;  
    }  
}
*****
*****
*****
*****
*****
for(int x=0; x<5; x++) {  //外層控制行數
        for (int y=0; y<5; y++) {  //內層控制個數
            System.out.print("*");
        }
        System.out.println();
}
*****
****
***
**
*
for(int x=0; x<5; x++) {  //外層控制行數
        for (int y=x; y<5; y++) {  //內層控制個數
            System.out.print("*");
        }
        System.out.println();
}
*
**
***
****
*****
for(int x=0; x<5; x++) {  //外層控制行數
        for (int y=-1; y<x; y++) {  //內層控制個數
            System.out.print("*");
        }
    System.out.println();
}
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
for(int x=1; x<=3; x++) {  //外層控制行數
        for (int y=1; y<=x; y++) {  //內層控制個數
            System.out.print(y+"*"+x+"="+x*y + "  ");
        }
        System.out.println();
}
* * * * * 
 * * * *
  * * *
   * *
    *
for(int x=1; x<=5; x++) { 
    for (int y=1; y<=x; y++) {  
        System.out.print(“ ”);
    }
    for (int z=x; z<=5; z++) {  
        System.out.print(“* ”);
    }
    System.out.println();
}

其他流程控制語句

break語句:應用於選擇結構和循環結構。

firstloop: for(int x=1; x<=5; x++) { 
        secondloop: for (int y=1; y<=5; y++) {  
            System.out.print(“x=”+x);
            break firstloop;
        }
}

continue語句:應用於循環結構。

轉義字符
- \n: 回車
- \t: 製表符
- \b: 退格
- \r: 按下回車鍵

02-07 方法

定義在類中的具有特定功能的一段獨立小程序

修飾符 返回值類型 方法名(參數類型  形式參數1,參數類型 形式參數2...)
{
    執行語句;
    return返回值;
}
  • 返回值類型:方法運行後的結果的數據類型
  • 參數類型:形式參數的數據類型
  • 形式參數:是一個變量,用於儲存調用方法時傳遞給方法的實際參數
  • 實際參數:傳遞給形式參數的具體數值
  • return:結束方法
  • 返回值:該方法運算後的結果,該結果會返回給調用者
public static int add(int a,int b) {
 c = a + b;
 return c;
}

int c = add(3, 4);

方法名一般格式:addTestOne

特殊情況:方法沒有具體的返回值

  • return後面直接用分號結束
  • 返回值類型用void關鍵字表示
public static void myPrint() {
 System.out.print(“Hello World”);
 return;
}

myPrint();

兩個明確:

  1. 明確方法的返回值類型
  2. 明確參數列表

方法重載

定義:在同一個類中,允許存在一個以上的同名方法,只要他們的參數個數或者參數類型不同。

重載特點:

  • 同一個類
  • 同名
  • 參數列表不同
  • 和返回值無關
//兩個整數的和
public static int add(int a, int b) {
    return a+b;
}
//兩個小數的和
public static double add(double a, double b) {
    return a+b;
}
//三個整數的和
public static int add(int a, int b, int c) {
    return add(a,b)+c;
}

重載的好處:方便與閱讀,優化代碼。

02-08 數組(引用數據類型)

同一種類型數據的集合,數組中的數據從0開始編號,方便操作。

//格式一
數據類型 [] 數組名 = new 數據類型 [數據的個數];  
int [] arr = new int[5];
//格式二
數據類型 [] 數組名 = new 數據類型 []{數據,數據,……};  
int [] arr = new int[]{3, 5, 1, 7};
int [] arr = new int{3, 5, 1, 7};
x = arr[0]; //取arr中0號位的值賦給x

  • 棧內存:存儲的都是局部變量,變量所屬的作用域一旦結束,變量自動釋放。
  • 堆內存:存儲的是數組和對象 凡是new建立在堆中。都有默認初始化值

arr存在棧內存中,存的不是具體數據,而是數據在堆內存中的地址。

int [] arr = new int [6];

左邊在棧內存,右邊在堆內存。

arr引用了對內存中的數據

//例子
//在棧內存中創建x和y,x和y的地址指向在堆內存中創建默認值爲0的數組
int[] x = new int [3];
int[] y = new int [3];
//在堆內存中把x和y0號位的數據替換成9和34
x[0] = 9;
y[0] = 34;
//在棧內存中把x的地址改成y的地址
x = y;

常見問題

int[] arr = new int [3];
System.out.println(arr[3]);
//ArraryIndexOutOfBoundsException
//訪問到數組中不存在的位,會發生該異常
arr = null;
System.out.println(arr[0]);
//NullPointerException
//當引用型變量沒有任何實體指向時,還在用其操作實體,會發生該異常。

常見操作

  • 數組遍歷:printArray(arr)

public static int printArray(int[] arr) {
    System.out.print("[");
    for (int x=0; x<arr.length; x++) {
        if(x!=arr.length-1)
            System.out.print(arr[x]+",");
        else
            System.out.println(arr[x]+"]");
        System.out.println(arr[x]);
    }
}
  • 數組最值:getMax(arr)
public static int getMax(int[] arr) {
    int max = arr[0];
    for (int x =1; x<arr.length; x++) {
        if (arr[x]>max)
            max = arr[x];
    }
    return max;
}
  • 選擇排序:selectSort(arr)
public static int selectSort(int[] arr) {
    for(int x=0; x<arr.length-1; x++) {
        if (arr[x]>arr[y]) {
            swap(arr, a, b);
        }
    }
}
  • 冒泡排序:bubbleSort(Arr)
public static int bubbleSort(int[] arr) {
    for(int x=0; x<arr.length-1; x++) {
        for(int y=0; y<arr.length-1-x; y++) {//-1是爲了避免角標越界,-x是爲了讓外循環增加一次,內循環參數與比較的元素個數遞減
            if(arr[y]>arr[y+1]) {
                swap(arr, y, y+1);
            }
        }
    }
}

排序位置置換代碼提取

public static void swap(int [] arr, int a,int b) {
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

數組查找

public static void getIndex(int [] arr, int key) {
    for(int x = 0; x<arr.length; x++) {
        if(arr[x]==key)
            return x;
    }
    return -1;
}

二維數組

格式1:

int[][] arr = new int[3][2];
arr[0][1] = 78;

格式2:

int[][] arr = new int[3][];
arr[0] = new int [3];
arr[1] = new int [1];
arr[2] = new int [2];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章