封裝核心三步驟
- 屬性
private 隱藏。
- 提供
public Getter/Setter 控制訪問。
- 在 Setter 中加入業務驗證 (合法性檢查)。
private float screen;
public float getScreen() { return screen; }
public void setScreen(float screen) {
if (screen > 0 && screen < 100) this.screen = screen; // 驗證
}
包機制管理類命名衝突
package com.company.module; 對應目錄結構。
import com.company.module.ClassName; 或 import com.company.module.*;。
- 核心包:
java.lang (基礎)、java.util (工具/集合)、java.io (輸入輸出)。
四種訪問修飾符對比表
| 修飾符 | 同類 | 同包 | 子類(異包) | 其他 |
| private | ✓ | ✗ | ✗ | ✗ |
| default (無) | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
this 關鍵字三大用途
- 區分同名屬性與參數:
this.name = name;
- 構造器鏈調用:
this(...) 必須首行。
- 返回當前對象引用:
return this; (鏈式調用)。
內部類四種形式詳解
1. 成員內部類 (非靜態)
class Outer {
private int x = 10;
class Inner {
void print() { System.out.println(Outer.this.x); } // 訪問外部類成員
}
}
// 創建: Outer.Inner in = new Outer().new Inner();
- 持有外部類引用 (
Outer.this),可訪問外部類所有成員 (含 private)。
- 編譯產出
Outer$Inner.class。
2. 靜態內部類 (static)
class Outer {
static int s = 1;
static class Nested {
void print() { System.out.println(s); } // 僅能訪問外部類 static 成員
}
}
// 創建: Outer.Nested n = new Outer.Nested(); // 無需外部實例
- 無外部類引用,不佔用外部實例內存,推薦用於實現單例模式 (Holder 模式)。
3. 方法內部類 (局部內部類)
void method() {
class Local { void doIt() {} }
new Local().doIt(); // 僅在方法內可見
}
- 不能有訪問修飾符/
static (Java 16+ 允許 static)。
- 可訪問方法的
final 或 effectively final 變量。
4. 匿名內部類
new Thread(new Runnable() {
@Override public void run() { System.out.println("匿名類"); }
}).start();
// 或實現接口/繼承類的即時子類
- 無名、單用、常用於事件監聽、線程任務、比較器。
- Lambda (Java 8+) 可替代單抽象方法接口的匿名類。
最佳實踐清單
- 默認
private,按需放寬;protected 僅用於繼承設計。
- 內部類若無需外部引用,**務必加
static**。
- 匿名類邏輯超過 3 行 → 提取為具名類 (Lambda 除外)。
- 封裝不僅是隱藏字段,更是不變約束的維護邊界。