Java 基礎語法與面向對象核心精講:從 HelloWorld 到多態實戰
Java 作為強類型、編譯執行、面向對象的語言,與 PHP、Python 等動態語言有本質區別。本文系統梳理 Java 程序結構、核心語法、數據類型、修飾符、面向對象三大特性,並對比 PHP 差異,助你建立扎實的 Java 思維模型。
一、Java 程序結構與入口
1. 最小化程序
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
2. 編譯與運行
javac HelloWorld.java # 編譯生成 HelloWorld.class
java HelloWorld # 執行字節碼
3. 核心規則 (與 PHP 差異巨大)
| 規則 | Java | PHP |
| 大小寫敏感 | 是 (類名、方法名、變數名嚴格區分) | 類/函數名不敏感,變數名敏感 |
| 源文件名 | 必須與 public 類名完全一致 (含大小寫),副檔名 `.java` | 無要求 |
| 入口方法 | 必須有 `public static void main(String[] args)` (Java Application) | 無固定入口,腳本頂層代碼即入口 |
| 變數聲明 | 先聲明類型,再使用 | 動態類型,無需聲明 |
| 字符串 | 雙引號 `"hello"`,連接符 `+` | 單/雙引號均可,連接符 `.` |
二、數據類型體系
1. 八大基本類型
| 分類 | 類型 | 位數 | 默認值 | 包裝類 |
| 整數 | byte | 8 | 0 | Byte |
| short | 16 | 0 | Short |
| int | 32 | 0 | Integer |
| long | 64 | 0L | Long |
| 浮點 | float | 32 | 0.0f | Float |
| double | 64 | 0.0d | Double |
| 字符 | char | 16 | '\u0000' | Character |
| 布爾 | boolean | 1 (JVM 實現) | false | Boolean |
注意:`long` 字面量需加 `L` (如 `100L`),`float` 需加 `F` (如 `3.14F`),`char` 用單引號。
2. 引用類型
- 類、介面、陣列、枚舉、註解。
- 變數存儲引用(地址),默認值 `null`。
- 對象在堆上創建,變數在棧上存引用。
3. 常量
final double PI = 3.14159; // 命名慣例:全大寫下劃線分隔
三、核心語法進階
1. 陣列
// 靜態初始化
int[] scores = {90, 85, 95};
String[] names = new String[]{"Tom", "Jerry"};
// 動態初始化
int[] nums = new int[5]; // 默認值 0
String[] cities = new String[3]; // 默認值 null
// 多維陣列
int[][] matrix = new int[3][4]; // 3行4列
String[][] ragged = new String[2][];
ragged[0] = new String[2];
ragged[1] = new String[3];
特點:長度固定、同類型、對象在堆上。`Arrays` 工具類提供排序、複製、查找、轉字符串等靜態方法。
2. 枚舉
enum Season { SPRING, SUMMER, AUTUMN, WINTER }
public class TestEnum {
Season current = Season.SPRING;
// 枚舉可定義字段、方法、構造器,實現介面
}
優點:類型安全、單例模式天然實現、可用於 `switch`、實現介面行為。
3. 修飾符總覽
| 分類 | 修飾符 | 類 | 屬性 | 方法 | 構造器 | 局部變數 |
| 訪問控制 | public | ✓ | ✓ | ✓ | ✓ | ✗ |
| protected | ✗ (頂層類) | ✓ | ✓ | ✓ | ✗ |
| default (無) | ✓ | ✓ | ✓ | ✓ | ✗ |
| private | ✗ (頂層類) | ✓ | ✓ | ✓ | ✗ |
| 非訪問 | static | ✓ (內部類) | ✓ | ✓ | ✗ | ✗ |
| final | ✓ | ✓ | ✓ | ✗ | ✓ (實際最終) |
| abstract | ✓ | ✗ | ✓ | ✗ | ✗ |
| synchronized | ✗ | ✗ | ✓ | ✗ | ✗ |
| volatile | ✗ | ✓ | ✗ | ✗ | ✗ |
| transient | ✗ | ✓ | ✗ | ✗ | ✗ |
4. 字符串處理三大類
| 類 | 可變性 | 線程安全 | 適用場景 |
| String | 不可變 | 是 (不可變即線程安全) | 少量拼接、常量、鍵值 |
| StringBuilder | 可變 | 否 (高效) | 單線程大量拼接 |
| StringBuffer | 可變 | 是 (同步開銷) | 多線程共享拼接 (少用) |
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) sb.append(i);
String result = sb.toString();
四、面向對象核心:類與對象
1. 類定義範例
public class Dog {
// 屬性 (封裝)
private String name;
private int age;
// 構造器 (可多載)
public Dog() {}
public Dog(String name) { this.name = name; }
public Dog(String name, int age) { this(name); this.age = age; }
// 方法
public void bark() { System.out.println(name + ": 汪汪!"); }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; } // this 區分同名屬性
}
2. 關鍵差異 (vs PHP)
- 構造器:同名方法,無返回類型,可多載。PHP 用 `__construct()` 只能有一個。
- 方法定義:`<修飾符> <返回類型> <方法名>(參數)`。PHP 用 `function` 關鍵字。
- 內部調用:直接 `methodName()` 或 `fieldName`,隱含 `this.`。PHP 用 `$this->method()` / `$this->field`。
- 文件結構:一個文件只能有一個 public 類,文件名必須匹配。PHP 無此限制。
五、面向對象三大特性深度解析
1. 封裝
- 屬性 `private`,提供 `public` getter/setter。
- 在 setter 中加入業務校驗 (如年齡範圍、性別合法值)。
- 優點:隱藏實現、數據安全、易維護、框架依賴 (反射調用 getter/setter)。
2. 繼承
public class Animal {
protected String name; // 子類可見
public void eat() { System.out.println(name + " 進食"); }
}
public class Dog extends Animal {
// 繼承 name, eat()
// 可新增屬性/方法,可重寫方法
@Override
public void eat() { System.out.println(name + " 啃骨頭"); }
}
- 單繼承:`extends` 只能繼承一個父類。
- 子類構造器默認調用 `super()` (父類無參構造器),需顯式 `super(參數)` 調用帶參構造器。
- 不繼承:父類 `private` 成員、構造器、`static` 成員 (但可訪問/隱藏)。
- 關聯 vs 繼承:「是一個」用繼承,「有一個」用組合/關聯 (如 `Person` 有 `Dog`)。
3. 多態
Animal a = new Dog(); // 父類引用指向子類對象
a.eat(); // 動態綁定:調用 Dog.eat()
// 應用場景
public void feed(Animal animal) { // 參數多態
animal.eat();
}
feed(new Dog());
feed(new Cat());
| 成員類型 | 編譯看左側 (引用類型) | 運行看右側 (實際對象) |
| 非靜態方法 | 檢查父類有無 | 執行子類重寫方法 |
| 靜態方法 | 調用父類 | 調用父類 (隱藏非重寫) |
| 屬性 (含靜態) | 訪問父類 | 訪問父類 |
核心:編譯期看引用類型,運行期看實際對象 (僅非靜態方法)。向上轉型自動,向下轉型需強制 `(Dog)a` 並建議 `instanceof` 守衛。
4. super vs this
| this | super |
| 指向 | 當前對象 | 父類對象引用 |
| 調用構造器 | `this(...)` 本類其他構造器 | `super(...)` 父類構造器 |
| 訪問成員 | `this.field` 當前類 (含繼承) | `super.field` 父類被隱藏成員 |
| 前提 | 無繼承也可用 | 需繼承關係 |
| 構造器限制 | 必須為首行 | 必須為首行,二擇一 |
六、常用核心類速查
- 包裝類:`Integer`、`Double` 等,提供 `parseInt`、`toString`、`compareTo`、自動拆裝箱。
- String:不可變,常用 `length()`、`charAt()`、`substring()`、`split()`、`replace()`、`format()`。
- Math:`random()`、`round()`、`max/min`、`pow()`、`sqrt()`。
- Arrays:`sort()`、`binarySearch()`、`toString()`、`fill()`、`copyOf()`。
- Object:`toString()`、`equals()`、`hashCode()`、`clone()`、`getClass()`、必須重寫 equals/hashCode 配對。
七、總結:Java 思維模型建立清單
- ✅ 類即類型,對象即實例,引用非對象本身。
- ✅ 編譯期類型檢查,運行期多態分派。
- ✅ 封裝是邊界,繼承是復用,多態是擴展。
- ✅ 基本類型傳值,引用類型傳引用值 (共享堆對象)。
- ✅ 構造器鏈 `this()`/`super()` 保證初始化完整性。
- ✅ 靜態屬於類,非靜態屬於對象,切勿混淆。
- ✅ 字符串不可變,拼接用 `StringBuilder`。
- ✅ 陣列固定長度,集合框架 (List/Set/Map) 才是主力。
夯實基礎,方能馭駕框架、架構與高併發。Java 的嚴謹正是其工程化威力的源泉。
- 上一篇文章: Java Web 常見異常處理避坑指南:EL 表達式失效、Hibernate 保留字衝突
- 下一篇文章: PreparedStatement 佔位符 (?) 完整用法指南與實戰範例
Copyright ©
程式碼之家 All Rights Reserved