面向對象(OOP)是 Java 的靈魂。本文系統梳理類/對象、構造器、方法重載、變量分類、靜態與實例、內存分配(棧/堆/方法區),配合「人遛狗被咬」「開車撞人」等生動案例與內存圖解,助你建立扎實的對象思維。
| 術語 | 定義 | 現實類比 |
|---|---|---|
| 類 | 同類事物的抽象模板(屬性+方法) | 「狗」這個概念 |
| 對象 | 類的具體實例 | 「大黃」這條具體的狗 |
| 成員變量 | 描述狀態(屬性) | 名字、年齡、顏色 |
| 方法 | 描述行為(功能) | 叫、跑、咬人 |
| 構造器 | 初始化對象的特殊方法 | 出生時賦予名字、屬性 |
// Dog.java
public class Dog {
String name;
public void bite(Person p) { System.out.println(name + "咬了" + p.name); }
public void run() { System.out.println(name + "跑了..."); }
}
// Person.java
public class Person {
String name;
public void walk() { System.out.println(name + "在街上散步"); }
public void meet(Dog d) { System.out.println(name + "遇到" + d.name); }
public void beat(Dog d) { System.out.println(name + "打了" + d.name); }
}
// Main.java
public class DogAndPerson {
public static void main(String[] args) {
Person p = new Person(); p.name = "張三";
Dog d = new Dog(); d.name = "大黃";
p.walk(); p.meet(d); d.bite(p); p.beat(d); d.run();
}
}
// Car.java
public class Car {
String mark; int power; String color; int price;
public void start(Person p) { System.out.println(p.name + "啟動了" + mark); }
public void speedUp() { System.out.println(mark + "加速"); }
public void run() { System.out.println(mark + "正常行駛"); }
public void hit(Person p) { System.out.println(mark + "撞了" + p.name); }
}
// Person.java (增加 drive 方法)
public void drive(Car c) { System.out.println(name + "駕駛" + c.mark); }
// Main.java
Car car = new Car(); car.mark = "寶馬";
Person p1 = new Person(); p1.name = "張三";
Person p2 = new Person(); p2.name = "李四";
car.start(p1); car.speedUp(); p1.drive(car); car.run(); car.hit(p2);
this.field = param 完成初始化this(...) 互調避免重複new ClassName() 瞬間,僅執行一次// Employee 完整示例:帶參構造器 + 週幾判斷工作/休息
public class Staff {
int number; String name; char sex; short age, w_age; long salary;
public Staff(String name, int number, char sex, short age, short w_age, long salary) {
this.name = name; this.number = number; this.sex = sex;
this.age = age; this.w_age = w_age; this.salary = salary;
}
public void work() { System.out.println(name + "今天工作"); }
public void rest() { System.out.println(name + "今天休息"); }
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// ... 輸入數據 ...
Staff s = new Staff(name, number, sex, age, w_age, salary);
short day = sc.nextShort();
if (day < 6) s.work(); else if (day <= 7) s.rest(); else System.out.println("error!");
}
}
| 維度 | 分類 | 關鍵字 | 內存區域 | 生命週期 | 訪問規則 |
|---|---|---|---|---|---|
| 成員變量 | 類變量 | static | 方法區 | 類加載 → 類卸載 | 類名. / 對象. 皆可 |
| 實例變量 | 無 | 堆 | 對象創建 → GC回收 | 對象. 訪問 | |
| 局部變量 | 形參/方法內/代碼塊 | 無 | 棧 | 方法調用 → 方法返回 | 僅方法內可見 |
| 方法 | 類方法 | static | 方法區 | 類加載 | 只能訪問 static 成員 |
| 實例方法 | 無 | 方法區 | 對象創建 | 可訪問所有成員 |
public class Student {
private String name; private int age;
public void study() { System.out.println("I love study!"); }
// getter/setter 省略
}
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student(); // ① 棧存引用,堆存對象
s.setName("John"); s.setAge(23); // ② 堆中對象屬性賦值
s.study(); // ③ 棧帧入棧執行 study()
Student s2 = s; // ④ 棧中新引用指向同一堆對象
s2.setName("Jack"); // ⑤ 修改同一對象,s 也變了
}
}
內存演變圖解:
Student.class 進入方法區,成員方法分配入口地址main() 棧幀s,指向堆地址s2,指向同一堆地址

this(...)max(int a, int b) 返回較大值isEven(int n) 判斷偶數isTriangle(int a, int b, int c) 判斷能否成三角形isRightTriangle(int a, int b, int c) 判斷直角三角形「理解內存模型,是寫出高性能、無 Bug Java 代碼的前提。
棧存引用、堆存對象、方法區存類——把這張圖刻進腦子裡。」