包機制、final 常量、static 靜態成員、繼承關係是 Java 面向對象編程的四大基石。本文通過代碼示例、內存圖解、最佳實踐,系統講解包創建與導入規則、final 變量賦值時機、靜態與實例成員區別、單例模式實現、繼承訪問權限與方法重寫/隱藏規則。
// 必須在源文件第一行非註釋語句
package com.itnba.maya.zy; // 命名規範:域名反轉 + 模塊 + 層級
src/com/itnba/maya/zy/。javac -d . Test.java 會自動創建目錄樹。
import com.itnba.maya.zyy.*; // 導入包下所有類
import com.itnba.maya.zyy.Foo; // 導入單個類(推薦,避免命名衝突)
// import 不能寫在 package 語句之前
final 變量Java 無 const 關鍵字,final 變量即常量。只有兩個賦值機會:
final int MAX = 100;
public class FinalDemo {
final String name; // 空白 final
final int id = 1; // 聲明時賦值
public FinalDemo(String name) {
this.name = name; // 構造器賦值
// id = 2; // 編譯錯誤:已賦值不可再賦值
}
public FinalDemo() {
this("default"); // 委派構造器,間接賦值 name
}
}
final:引用不可變,但對象內部狀態可變(final List list = new ArrayList(); list.add(1); // 合法)。final:防止在方法內修改引用指向。| 維度 | 實例成員 | 靜態成員 | ||
|---|---|---|---|---|
| 歸屬 | 屬於對象 | 屬於類,全局唯一 | ||
| 內存 | 堆內存(每個對象一份) | 方法區/元空間(類加載時分配) | ||
| 訪問 | obj.field / obj.method() | Class.field / Class.method() (也可對象訪問但不推薦) | ||
| 生命週期 | 隨對象創建/銷毀 | 隨類加載/卸載 | ||
| 可訪問成員 | 實例+靜態 | 僅靜態(無 this 引用) |
| 修飾符 | 同類 | 同包子類 | 不同包子類 | 非子類 |
|---|---|---|---|---|
| private | ✓ | ✗ | ✗ | ✗ |
| default(包私有) | ✓ | ✓ | ✗ | ✓ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
class Animal {
protected String name = "動物";
public void sound() { System.out.println(name + " 叫聲"); }
public static void staticSound() { System.out.println("靜態方法"); }
}
class Bird extends Animal {
// 重寫實例方法:同樣簽名,@Override 可選但推薦
@Override
public void sound() {
System.out.println("鳥鳴: " + this.name); // 訪問父類 protected 字段
}
// 隱藏靜態方法:非重寫,編譯期綁定
public static void staticSound() {
System.out.println("鳥類靜態方法");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Bird();
a.sound(); // 動態分派 → Bird.sound() → "鳥鳴: 動物"
a.staticSound(); // 靜態綁定 → Animal.staticSound() → "靜態方法"
Bird.staticSound(); // → "鳥類靜態方法"
}
}
a.name 為 "動物")。
父類靜態字段/塊 → 子類靜態字段/塊 → 父類實例字段/塊 → 父類構造器 → 子類實例字段/塊 → 子類構造器