介紹

這一篇是 Java 基本語法介紹的第二篇,我們要來繼續探討程式碼架構。

有效範圍

Java 使用 { } 來表示程式中某個範圍區塊,變數或物件的有效範圍 (scope) 會被限制在當時被宣告的區塊內,超出了該區塊則會被回收。

1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args) {
int x = 10;
{
int x = 20; // 無法再宣告,因為 x 已在外層區塊宣告過
int y = 30;
}
System.out.println(x);
System.out.println(y); // 無法使用,因為 y 的範圍僅限於區塊內
}
}

製作套件 Package

把特定功能的程式碼包裝成一個套件 (package),之後需要時可以直接拿來使用。

自訂套件

檔案位置:

1
2
3
4
src/
└─ main/
└─ java/com/raylon/util/
└─ HelloUtil.java

內容:

1
2
3
4
5
6
7
package com.raylon.util;

public class HelloUtil {
public static void sayHello(String name) {
System.out.println("Hello, " + name + "!");
}
}

匯入套件

檔案位置:

1
2
3
4
src/
└─ main/
└─ java/com/raylon/
└─ main.java

內容:

1
2
3
4
5
6
7
import com.raylon.util.HelloUtil;

public class Main {
public static void main(String[] args) {
HelloUtil.sayHello("Java");
}
}

流程控制

if 判斷

if … else …

1
2
3
4
5
6
7
boolean isRaining = false;

if (isRaining) {
System.out.println("Bring an umbrella!");
} else {
System.out.println("No rain today, no need for an umbrella!");
}

if … else if … else …

1
2
3
4
5
6
7
8
9
int weather = 2; // 1 = raining, 2 = sunny, 3 = cloudy

if (weather == 1) {
System.out.println("Bring an umbrella.");
} else if (weather == 2) {
System.out.println("Wear sunglasses.");
} else {
System.out.println("Just go outside normally.");
}

if 的簡寫

1
2
3
int time = 20;
String result = (time < 18) ? "Good day." : "Good evening.";
System.out.println(result);

上述程式碼等同於

1
2
3
4
5
6
int time = 20;
if (time < 18) {
System.out.println("Good day.");
} else {
System.out.println("Good evening.");
}

switch 條件判斷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int day = 4;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
case 4:
System.out.println("Thursday");
break;
}

break

用來中斷迴圈。

1
2
3
4
5
6
for (int i = 0; i < 5; i++) {
if (i == 5) {
break;
}
System.out.println("i=" + i);
}

continue

跳過迴圈的這一步,執行下一步。

1
2
3
4
5
6
for (int i = 0; i < 5; i++) {
if (i == 3) {
continue;
}
System.out.println("i=" + i);
}

Loop 迴圈

For

1
2
3
for (int i = 0; i < 10; i++) {
System.out.print(" " + i);
}

While

1
2
3
4
5
6
int sum = 0, i = 2;
while (i <= 100) {
sum += i;
i += 2;
}
System.out.println("1~100的偶數和(2+4+...+100)=" + sum);

Do … while

1
2
3
4
5
int i = 1;
do {
System.out.println("這是第" + i + "次執行迴圈");
} while (i++ < 4);
System.out.println("執行完畢,i 的值=" + i);

外覆類別 wrapper class

原生資料類型宣告的變數,只能存放一個內容值,並沒有具備屬性與方法。為了有效處理各個原生資料類型,Java 針對原生資料類型定義了對應的類別,讓它們有了方法可以使用。

型態 原生資料類型 外覆類別
整數 byte Byte
short Short
int Integer
long Long
浮點數 float Float
double Double
字元 char Character
布林值 boolean Boolean

宣告外覆類別。

1
2
Integer myInt = 5;
Double myDouble = 5.99;

宣告完,就可以使用外覆類別提供的方法,下表以 Integer 為例。

方法 功能
外覆類別.intValue() 將外覆資料類型轉為原生資料型態
外覆類別.toString() 將外覆資料類型轉為字串
外覆類別.valueOf(原生資料型態) 將原生資料型態轉為外覆資料型態

字串類別 StringBuffer

StringBuffer 可以用來修改字串,對字串進行修改、新增、刪除等,對於需要多次修改字串內容時很有幫助。

如何建立字串類別。

建構子 說明
StringBuffer() 預設可以儲存 16 字元的長度,當儲存資料超過 16 字元時會自動擴充。
StringBuffer(int length) 指定儲存字元的長度。
StringBuffer(String str) 將字串內容儲存為 StringBuffer 物件。

常用的方法統整:

方法 功能
append(object) 新增字串或其他型態資料。 (object 可以是原生資料類型或 string 型態)
capacity() 取得 stringbuffer 儲存空間大小。
charAt(int index) 取得字串內指定 index 的字元。
delete(int start, int end) 刪除字串內開始位址到結束位址的內容。
deleteAt(int index) 刪除字串內指定 index 的字元。
insert(int index, object) 將物件內容加入字串的指定位址。
reverse() 字串反轉。
setCharAt(int index, char) 將字串內的指定 index 的字元替換為指定字元。
substring(int start) 取得 stringbuffer 物件內容的 start 位址到底的內容。
substring(int start, int end) 取得 stringbuffer 物件內容的 start 到 end 位址的內容。
toString() 將 stringbuffer 物件轉換成一般的字串物件。

範例:

1
2
3
4
StringBuffer myStringBuffer = new StringBuffer("Hello");
myStringBuffer.append(" World!");
myStringBuffer.insert(5, ",");
System.out.println(myStringBuffer);

陣列 Array

可以用來儲存多個相同資料類型的資料。

1
2
int[] num = new int[5]; // [0, 0, 0, 0, 0]
int[] num2 = {73, 82, 66, 54, 23, 11};

在 Java 中的索引值都是從 0 開始。

有以下三種方式列出陣列內容: 使用索引值、使用迴圈輸出、使用內建方法。

使用索引

1
2
int[] num = { 73, 82, 66, 54, 23, 11 };
System.out.println(num2[0]); // 73

迴圈輸出

1
2
3
4
int[] num = { 73, 82, 66, 54, 23, 11 };
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}

內建方法

1
2
3
4
import java.util.Arrays;

int[] num = { 73, 82, 66, 54, 23, 11 };
System.out.println(Arrays.toString(num)); // [73, 82, 66, 54, 23, 11]

索引值超出範圍的錯誤

1
2
int[] num = { 73, 82, 66, 54, 23, 11 };
System.out.println(num[6]);

會出現:

1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 6

多維陣列

1
2
int[][] score = new int [2][3]; // [[0, 0, 0], [0, 0, 0]]
System.out.println(Arrays.deepToString(score));

deepToString(): 使用遞迴的方式將內容轉換為 String。

陣列內建方法介紹

方法 功能
Arrays.equals(array1, array2) 比較兩個陣列的內容是否相同。
Arrays.fill(array, value) 將所有元素設定指定值。
Arrays.fill(array, start index, amount, value) 將索引範圍內的元素填入指定值。
Arrays.binarySearch(array, value) 在陣列中搜尋指定值。
Arrays.sort(array) 排序陣列內容。
Arrays.toString(array) 將陣列轉換為字串。

程式進入點接收的陣列參數

學到了陣列,我們就可以回來看程式的進入點。

1
public static void main(String[] args) { }

String[]: 屬於 main 方法接收參數的類型。
args: 是參數名稱。

我們在執行程式時可以附帶參數,如下:

1
<java 檔案名稱> <附加參數>

我們輸入的附加參數會以空格為間隔,儲存在 args 變數裡。
我們可以從以下程式碼驗證。

1
2
3
public static void main(String[] args) {
System.out.println(args.length);
}

傳入的參數是以字串形式呈現,如果要進行計算則必須要轉換為數值資料格式。

動態陣列 ArrayList

ArrayList 與原生的 Array 差異在於,原生的陣列無法直接修改陣列大小,ArrayList 則可以隨時修改。
ArrayList 只能用來存放物件形式的資料類型,不支援原生資料類型 (例如: int, float, double 等)。

如何建立 ArrayList。

建構子 說明
ArrayList() 建立一個空的 ArrayList 物件。
ArrayList(集合物件) 將集合物件指定給 ArrayList 物件。
ArrayList(length) 建立指定長度的 ArrayList 物件。

常用的方法統整:

方法 功能 回傳值類型
add(元素) 將指定的元素加入 ArrayList 陣列的最後。 boolean
add(index, 元素) 插入元素至 ArrayList 陣列中索引指定的位置。 void
clear() 清除所有元素。 void
contains(元素) 判斷 ArrayList 陣列中是否有包含此元素。 boolean
get(index) 取得指定索引的元素。 object
remove(index / object) 移除指定索引的元素。 object
set(index, 元素) 將指定元素的內容取代。 object
size() 回傳 ArrayList 陣列中元素的數量。 int

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ArrayList<String> fruits = new ArrayList<>();

// 新增元素
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");

// 插入元素
fruits.add(1, "Mango");

// 取得元素
System.out.println("第一個水果是: " + fruits.get(0)); // 第一個水果是: Apple

// 修改元素
fruits.set(2, "Grapes");

// 移除元素
fruits.remove("Banana");

// 顯示所有元素
System.out.println("目前的清單: " + fruits); // 目前的清單: [Apple, Grapes, Cherry]

// 顯示大小
System.out.println("共有 " + fruits.size() + " 個水果"); // 共有 3 個水果