Java 面向對象核心:類與對象、封裝繼承多態、構造器、static、參數傳遞
面向過程 vs 面向對象
| 維度 | 面向過程 (C) | 面向對象 (C++/Java) |
| 思維方式 | 自上而下、步驟序列 | 尋找名詞→建立類→定義屬性/方法→類之間關係 |
| 適合場景 | 簡單、線性流程 (如開車:踩離合→掛檔→踩油門) | 複雜系統 (如造車:引擎/車輪/車身各自封裝、組裝) |
| 核心差異 | 關注「怎麼做」 | 關注「誰來做」 |
宏觀用 OO 把握架構,微觀用 PO 處理細節 — 這是工程師的成熟標誌。
類與對象
- 類:模板/藍圖,定義一類事物的靜態屬性與動態行為
- 對象:類的實例,具體事物,佔用堆內存
ClassName obj = new ClassName():實例化
class Car {
String name; int age; String color; String zuowei;
// 無參構造器 (若自定義有參構造器,系統不再提供)
public Car() {}
// 有參構造器:創建時直接賦值
public Car(String name, int age, String color, String zuowei) {
this.name = name; this.age = age; this.color = color; this.zuowei = zuowei;
}
void run() { System.out.println("我是汽車我能跑,還能帶人跑"); }
}
public static void main(String[] args) {
Car car = new Car("極品寶馬", 3, "黑色", "真皮");
car.run();
}
三大特性
| 特性 | 核心思想 | 關鍵字/機制 |
| 封裝 | 隱藏內部實現,對外暴露介面 | private + getter/setter、權限修飾符 |
| 繼承 | 子類複用父類代碼,建立 is-a 關係 | extends、super、@Override |
| 多態 | 父類引用指向子類對象,運行期動態綁定 | 向上轉型、方法覆寫、動態綁定 |
權限修飾符可見性矩陣
| private | default | protected | public |
| 本類 | ✓ | ✓ | ✓ | ✓ |
| 同包類 | ✗ | ✓ | ✓ | ✓ |
| 子類(異包) | ✗ | ✗ | ✓ | ✓ |
| 其他包類 | ✗ | ✗ | ✗ | ✓ |
static 關鍵字
- 修飾變數/方法 → 屬於類、共享、
ClassName.member 存取
static final → 常量 (命名全大寫+下劃線)
- 限制:靜態方法不可用
this、不可直接呼叫非靜態成員、區域變數不可 static
- 工廠方法模式:
NumberFormat.getPercentInstance()
方法參數傳遞機制
Java 只有值傳遞:基本型別傳值副本,引用型別傳引用副本 (指向同一物件)
| 場景 | 能否修改原值 | 說明 |
| 基本型別參數 | 否 | 修改的是副本 |
| 引用型別參數 — 修改物件狀態 | 是 | obj.setName("new") 影響原物件 |
| 引用型別參數 — 重新指向新物件 | 否 | obj = new Obj() 只改變區域引用 |
// 示例:swap 無法交換實際物件引用
public static void switchBook(Book b1, Book b2) {
Book temp = b1; b1 = b2; b2 = temp; // 僅交換區域引用
}
實戰練習:三維空間點類
class Point {
double x, y, z;
public Point(double x, double y, double z) { this.x=x; this.y=y; this.z=z; }
public double getDistance(Point p) {
return Math.sqrt(Math.pow(x-p.x,2) + Math.pow(y-p.y,2) + Math.pow(z-p.z,2));
}
}
Point p = new Point(5, 6, 7.8);
Point origin = new Point(0, 0, 0);
System.out.println(p.getDistance(origin)); // 輸出距離