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個英文字母大小寫,數字,_$組成。
規則:
- 數字不能開頭
- 不可以使用關鍵字
02-03 註釋
用於註解說明解釋程序的文字就是註釋
註釋的格式:
- 單行註釋:// 註釋文字
- 多行註釋:/註釋文字 /
- 文檔註釋:/*註釋文字 /
02-04 常量和變量
常量
不能改變的數值
常量分類:
- 整數常量:所有整數
- 小數常量:所有小數
- 布爾型常量:true false
- 字符常量:將一個數字字母或者符號用單引號(‘’)標識
- 字符串常量。將一個或多個字符用雙引號(“”)標識
- null常量:null
整數有四種表現形式
- 二進制:0,1
- 八進制:0 - 7
- 十進制:0 - 9
- 十六進制: 0 - 9,A - F,0x開頭。
負數的二進制表現形式
- 對應正數二進制取反加1
變量
- 內存中的一個存儲區域
- 該區域有自己的名稱(變量名)和類型(數據類型)
- 該區域的數據可以在同一類型範圍內不斷變化
定義變量的格式:變量名=初始化值
數據類型:
- 基本數據類型
- 數值型
- 整數類型
- byte 字節 8bit (-2^7^, 2^7^-1) (-128, 127)
- short 短整型 16bit (-2^15^, 2^15^-1) (-32768, 32767)
- int 整型 32bit(-2^31^, 2^31^-1)
- long 長整型 64bit(-2^63^, 2^63^-1)
- 浮點類型
- float
- double
- 整數類型
- 字符型(char)(0, 65535)
- 布爾型(boolean)
- 數值型
- 引用數據類型
- 類(class)
- 接口(interface)
- 數組([ ])
//變量基本演示
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 運算符
- 算數運算符
- “ + ”
- “ - ”
- “ * ”
- “ / ”
- “ % ” 取餘,模
- “ ++ ” 自增,++ a先加再算,a++ 先算再加
- “ – ” 自減,– a先減再算,a– 先算再減
- 賦值運算符
- “ = ” 賦值
- “ += ” a+=1 一次賦值運算, a=a+1 一次算數運算和一次賦值運算
- “ -= ”
- “ *= ”
- “ /= ”
- “ %= ”
- 比較運算符(運算完的結果必須是true或者false)
- “ == ” 相等於
- “ > ” 大於
- “ < ” 小於
- “ >= ” 大於等於
- “ <= ” 小於等於
- “ != ” 不等於
- “ instanceof ” 檢查是否是類的對象
- 邏輯運算符(用於連接兩個boolean類型的表達式)
- “ & ” AND(與)
- “ | ” OR (或)
- “ ^ ” XOR(異或)兩邊相同則false
- “ ! ” NOT(非)
- “ && ”AND(短路)左邊爲false時,右邊不參與運算
- “ || ”OR (短路)左邊爲true時,右邊不參與運算
- 位運算符(二進制位)
- “ << ” 左移:左移幾位就是該數據乘以2的幾次方
- “ >> ” 右移:右移幾位就是該數據除以2的幾次方,高位出現的空位用原來高位的數字補
- “ >>> ” 無符號右移:高位用0補
- “ & ” 與
- “ | ” 或
- “ ^ ” 異或
- “ ~ ” 反碼
- 三元運算符:三個元素參與運算的符號
格式:(條件表達式)?表達式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語句會將具體的答案都加載進內存
循環結構
當對某些代碼執行很多次時,使用循環結構。
- 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);
- do while循環//循環體至少執行一次
do {
執行語句;
} while(條件表達式);
- for循環
for(初始化表達式; 循環條件表達式; 循環後的操作表達式){
執行語句;
}
for和while的特點:
- for和while可以互換。
- 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();
兩個明確:
- 明確方法的返回值類型
- 明確參數列表
方法重載
定義:在同一個類中,允許存在一個以上的同名方法,只要他們的參數個數或者參數類型不同。
重載特點:
- 同一個類
- 同名
- 參數列表不同
- 和返回值無關
//兩個整數的和
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];