跳轉到

Java基礎:語言特性與基本語法

1. 簡介

Java 是一種廣泛使用的程式設計語言,自 1995 年由 Sun Microsystems 公司發布以來,已經成為全球最受歡迎的程式設計語言之一。Java 的發展歷程充滿創新,從最初的 JDK 1.0 到現在的23,每個版本都帶來了新的特性和改進。

Java 的重要特性包括:

  1. 跨平台性:「一次編寫,到處執行」的理念。
  2. 物件導向:封裝、繼承和多型等物件導向概念。
  3. 強型別:嚴格的編譯時期和執行時期類型檢查。
  4. 自動記憶體管理:使用垃圾回收機制,減輕開發者的負擔。
  5. 豐富的標準函式庫:提供大量可重用的程式碼。

2. Java的基本語言特性

Java 擁有許多獨特的語言特性,以下是 Java 的幾個關鍵特性:

  1. 物件導向: Java 是一種純物件導向的程式設計語言。除了基本資料型別外,Java 中的一切都是物件。這種設計促進了程式碼的重用性、可維護性和擴展性。Java 支援封裝、繼承和多型等物件導向的核心概念。

  2. 平台獨立性: Java 的「一次編寫,到處執行」理念是通過 Java 虛擬機器(JVM)實現的。Java 程式碼首先被編譯成位元組碼,然後可以在任何安裝了 JVM 的平台上執行。這大大提高了 Java 程式的可移植性。

  3. 安全性: Java 設計時就考慮到安全性。它提供安全管理器、存取控制器和類別載入器等機制,以確保程式碼的安全執行。此外,Java 沒有指標概念(這是另外的話題@Unsafe -- XD),避免了許多與記憶體相關的安全問題。

  4. 多執行緒支援: Java 內建對多執行緒程式設計的支援。它提供了同步機制和執行緒間通信的工具,使開發者能夠輕鬆創建高效能的並行應用程式。

  5. 自動記憶體管理: Java 使用垃圾回收機制自動管理記憶體。這消除了手動記憶體管理的需求,減少了記憶體洩漏和其他相關錯誤的可能性。

  6. 強型別: Java 是一種強型別語言,所有變數都必須先宣告後使用。這有助於在編譯時期捕獲錯誤,提高程式的穩定性。

這些特性使 Java 成為一個強大、安全且靈活的程式設計語言,適用於各種應用場景,從小型應用程式到大型企業系統。

3. Java程式的基本結構

Java 程式的基本結構包含幾個關鍵元素:類別、主方法和套件。讓我們詳細了解這些元素:

  1. 類別(Class): 在 Java 中,類別是程式的基本單位。每個 Java 程式至少包含一個類別。類別是物件的藍圖,定義了物件的屬性和行為。

  2. 主方法(Main Method): 主方法是 Java 應用程式的入口點。當你執行一個 Java 程式時,JVM 會首先尋找並執行主方法。主方法必須是公開的(public),靜態的(static),沒有回傳值(void),並且接受一個字串陣列作為參數。

  3. 套件(Package): 套件用於組織和管理相關的類別。它們提供了一種命名空間機制,幫助避免命名衝突,並提高程式的可維護性。

以下是一個基本的 Java 程式結構示例:

package com.example.myapp;  // 套件宣告

public class HelloWorld {  // 類別宣告
    public static void main(String[] args) {  // 主方法
        System.out.println("Hello, World!");  // 程式邏輯
    }
}

在這個例子中: - package com.example.myapp; 宣告了這個類別所屬的套件。 - public class HelloWorld 定義了一個名為 HelloWorld 的公開類別。 - public static void main(String[] args) 是程式的主方法。 - System.out.println("Hello, World!"); 是實際執行的程式邏輯,這裡是輸出一行文字。

理解這個基本結構對於開始 Java 程式設計至關重要。隨著你的學習深入,你會發現 Java 程式可以變得更加複雜,但這個基本結構始終是核心。

4. 資料型別與變數

在 Java 中,資料型別和變數是程式設計的基礎。Java 是一種強型別語言,這意味著所有變數都必須在使用前宣告其型別。Java 的資料型別分為兩大類:基本資料型別和參考資料型別。

基本資料型別

Java 有 8 種基本資料型別:

  1. 整數型別:byte(8位元)、short(16位元)、int(32位元)、long(64位元)
  2. 浮點數型別:float(32位元)、double(64位元)
  3. 字元型別:char(16位元)
  4. 布林型別:boolean

參考資料型別

參考資料型別包括列舉 (enum)、介面 (interface)、介面、陣列 (Array)、自定義的類別 (class)等。最常用的參考型別是 String(字串)。

變數宣告與初始化

在 Java 中,變數的宣告語法為:

資料型別 變數名稱 [= 初始值];

以下是一些變數宣告和初始化的例子:

// 基本資料型別
int age = 25;
double salary = 50000.50;
char grade = 'A';
boolean isStudent = true;

// 參考資料型別
String name = "張小明";
int[] numbers = {1, 2, 3, 4, 5};

型別轉換

Java 支援兩種型別轉換:隱式轉換(自動轉換)和顯式轉換(強制轉換)。

  1. 隱式轉換:當較小的型別轉換為較大的型別時,可以自動進行。 例如:int x = 10; long y = x;

  2. 顯式轉換:當較大的型別轉換為較小的型別時,需要明確指定。 例如:double x = 10.5; int y = (int) x;

了解並正確使用這些資料型別和變數是編寫高品質 Java 程式的基礎。在實際編程中,選擇適當的資料型別可以提高程式的效能和可讀性。

5. 運算子與運算式

Java 提供了豐富的運算子,用於執行各種運算。理解這些運算子對於編寫有效的 Java 程式至關重要。以下是 Java 中主要的運算子類型:

算術運算子

用於執行基本的數學運算: - 加法 (+) - 減法 (-) - 乘法 (*) - 除法 (/) - 取餘數 (%)

範例:

int a = 10, b = 3;
System.out.println("a + b = " + (a + b));  // 輸出:13
System.out.println("a % b = " + (a % b));  // 輸出:1

比較運算子

用於比較兩個值: - 等於 (==) - 不等於 (!=) - 大於 (>) - 小於 (<) - 大於等於 (>=) - 小於等於 (<=)

範例:

int x = 5, y = 8;
System.out.println("x < y: " + (x < y));  // 輸出:true

邏輯運算子

用於組合布林表達式: - 與 (&&) - 或 (||) - 非 (!)

範例:

boolean a = true, b = false;
System.out.println("a && b: " + (a && b));  // 輸出:false
System.out.println("a || b: " + (a || b));  // 輸出:true

位元運算子

用於執行位元級別的運算: - 位元與 (&) - 位元或 (|) - 位元異或 (^) - 位元反轉 (~) - 左移 (<<) - 右移 (>>) - 無符號右移 (>>>)

範例:

int a = 5, b = 3;
System.out.println("a & b: " + (a & b));  // 輸出:1
System.out.println("a << 1: " + (a << 1));  // 輸出:10

賦值運算子

用於給變數賦值: - 簡單賦值 (=) - 加法賦值 (+=) - 減法賦值 (-=) - 乘法賦值 (*=) - 除法賦值 (/=) - 取餘數賦值 (%=)

範例:

int x = 10;
x += 5;  // 等同於 x = x + 5
System.out.println("x: " + x);  // 輸出:15

6. 控制流程

控制流程是程式設計中的基本概念,決定程式的執行順序。Java 有多種控制流程結構,以下是 Java 中主要的控制流程結構:

if-else 條件判斷

用於根據條件執行不同的程式碼區塊。

int score = 85;
if (score >= 90) {
    System.out.println("優");
} else if (score >= 80) {
    System.out.println("良");
} else if (score >= 70) {
    System.out.println("普通");
} else {
    System.out.println("需要改進");
}

switch 陳述句

用於多重條件判斷,特別適合處理多個離散值的情況。

int dayOfWeek = 3;
switch (dayOfWeek) {
    case 1:
        System.out.println("星期一");
        break;
    case 2:
        System.out.println("星期二");
        break;
    case 3:
        System.out.println("星期三");
        break;
    // ... 其他情況
    default:
        System.out.println("無效的日期");
}

for 迴圈

用於已知迭代次數的情況。

for (int i = 0; i < 5; i++) {
    System.out.println("迭代 " + i);
}

while 迴圈

用於不確定迭代次數,但知道結束條件的情況。

int count = 0;
while (count < 5) {
    System.out.println("計數: " + count);
    count++;
}

do-while 迴圈

類似 while 迴圈,但保證至少執行一次。

int num = 1;
do {
    System.out.println("數字: " + num);
    num *= 2;
} while (num < 100);

跳轉陳述句

  • break:用於跳出迴圈或 switch 陳述句
  • continue:用於跳過當前迭代,繼續下一次迭代
  • return:用於從方法中返回,並可選擇性地返回一個值
for (int i = 0; i < 10; i++) {
    if (i == 5) {
        continue;  // 跳過 5
    }
    if (i == 8) {
        break;  // 在 8 時結束迴圈
    }
    System.out.println(i);
}

7. 陣列

陣列是 Java 中用於儲存多個相同類型元素的資料結構,以下是關於 Java 陣列的重要概念:

一維陣列

一維陣列是最基本的陣列類型,是一個線性的資料集合。

宣告和初始化一維陣列:

// 宣告
int[] numbers;

// 宣告並指定大小
int[] scores = new int[5];

// 宣告並初始化
int[] ages = {25, 30, 35, 40, 45};

存取陣列元素:

int firstAge = ages[0];  // 獲取第一個元素
ages[1] = 31;  // 修改第二個元素

多維陣列

Java 支援多維陣列,最常見的是二維陣列。

宣告和初始化二維陣列:

// 宣告
int[][] matrix;

// 宣告並指定大小
int[][] grid = new int[3][3];

// 宣告並初始化
int[][] points = {{1, 2}, {3, 4}, {5, 6}};

存取二維陣列元素:

int value = points[1][0];  // 獲取第二行第一列的元素
grid[0][2] = 5;  // 修改第一行第三列的元素

陣列的常用操作

  1. 獲取陣列長度:

    int length = ages.length;
    

  2. 遍歷陣列:

    for (int i = 0; i < ages.length; i++) {
        System.out.println(ages[i]);
    }
    

  3. 使用增強型 for 迴圈(for-each):

    for (int age : ages) {
        System.out.println(age);
    }
    

  4. 複製陣列:

    int[] copyOfAges = Arrays.copyOf(ages, ages.length);
    

  5. 排序陣列:

    Arrays.sort(ages);
    

陣列是 Java 程式設計中的基礎概念,需要注意的是,Java 的陣列是固定大小的。如果需要動態大小的資料結構,可以考慮使用 Java 集合框架中的 ArrayList 或 LinkedList。

8. 方法

方法是 Java 中執行特定任務的程式碼區塊。它們是物件導向程式設計的核心元素,提供了程式碼重用和模組化的機制。以下是關於 Java 方法的重要概念:

方法的定義與呼叫

方法的基本結構:

修飾符 回傳型別 方法名稱(參數列表) {
    // 方法體
    return 回傳值;  // 如果有的話
}

範例:

public static int add(int a, int b) {
    return a + b;
}

// 呼叫方法
int result = add(5, 3);
System.out.println("結果:" + result);  // 輸出:結果:8

參數傳遞

Java 使用「傳值」的方式傳遞參數。對於基本型別,傳遞的是值的副本;對於物件,傳遞的是參考的副本。

public static void modifyValues(int x, int[] arr) {
    x = 100;  // 不會影響原始變數
    arr[0] = 100;  // 會影響原始陣列
}

int num = 10;
int[] numbers = {1, 2, 3};
modifyValues(num, numbers);
System.out.println(num);  // 輸出:10
System.out.println(numbers[0]);  // 輸出:100

回傳值

方法可以回傳一個值,或者使用 void 表示不回傳任何值。

public static String greet(String name) {
    return "你好," + name;
}

public static void printGreeting(String name) {
    System.out.println("你好," + name);
}

方法重載

Java 支援方法重載,允許在同一個類別中定義多個同名但參數不同的方法。

public static int multiply(int a, int b) {
    return a * b;
}

public static double multiply(double a, double b) {
    return a * b;
}

int result1 = multiply(5, 3);  // 呼叫 int 版本
double result2 = multiply(5.5, 3.2);  // 呼叫 double 版本

可變參數

Java 允許方法接受不定數量的參數。

public static int sum(int... numbers) {
    int total = 0;
    for (int num : numbers) {
        total += num;
    }
    return total;
}

int result = sum(1, 2, 3, 4, 5);  // 可以傳入任意數量的參數
System.out.println("總和:" + result);  // 輸出:總和:15

本篇文章同步刊載iThome: iThome
筆者個人的網站: JUNYI