在 Java 程式設計中,類與物件是物件導向程式設計(OOP)的基石。本文將系統性地講解類的定義、物件的建立與使用、成員變數與區域變數的區別、構造方法的作用與重載,以及靜態成員與初始化塊的運作機制,並附上完整程式碼範例幫助你深入理解。
類是物件的抽象藍圖,定義了一組擁有相同屬性(成員變數)與行為(方法)的物件集合。物件則是類的具體實例,佔據實際記憶體空間。
訪問修飾符 class 類名 {
資料類型 屬性名;
訪問修飾符 回傳值類型 方法名() {}
}
// 建立物件 類名 物件名 = new 類名(); // 存取屬性與呼叫方法 物件名.屬性名; 物件名.方法名();
同一個類可以建立多個物件,每個物件擁有獨立的成員變數副本,互不干擾。
| 特性 | 成員變數 | 區域變數 |
|---|---|---|
| 定義位置 | 類中,方法外部 | 方法內部或參數列表 |
| 作用範圍 | 整個類(或經由物件存取) | 僅限所在方法/區塊 |
| 預設初始值 | 有(數值型為 0,布林為 false,引用型為 null) | 無,必須顯式初始化才能使用 |
| 記憶體位置 | 堆記憶體(隨物件) | 棧記憶體 |
| 同名優先權 | 較低 | 較高(就近原則) |
構造方法是特殊的方法,用於在 new 物件時完成初始化工作。其特徵為:
void 也不寫)package com.test;
public class Telephone {
double screen;
double cpu;
double mem;
// 無參構造方法
public Telephone() {
System.out.println("無參數的構造方法");
}
// 有參構造方法:實現屬性初始化與合法性檢查
public Telephone(double newScreen, double newCpu, double newMem) {
screen = newScreen;
cpu = newCpu;
mem = newMem;
System.out.println("有參數的構造方法");
}
public void sendMessage() {
System.out.println("screen:" + screen + ";cpu:" + cpu + ";mem:" + mem);
}
}
package com.test;
public class Demo {
public static void main(String[] args) {
// 使用無參構造建立物件,再逐一賦值
Telephone phone = new Telephone();
phone.screen = 5.4;
phone.cpu = 1.2;
phone.mem = 6.0;
phone.sendMessage();
// 使用有參構造直接初始化
Telephone phone1 = new Telephone(5.0, 1.5, 4.0);
phone1.sendMessage();
}
}
執行結果:
無參數的構造方法 screen:5.4;cpu:1.2;mem:6.0 有參數的構造方法 screen:5.0;cpu:1.5;mem:4.0
使用 static 修飾的成員稱為靜態成員(類成員),特點如下:
類名.靜態成員 直接存取(推薦),也可透過物件存取package com.test;
public class Demo8 {
public static String classroom = "Java班"; // 靜態變數
public String schoolName = "希望小學"; // 實例變數
public static void getName() {
System.out.println("=======getName=======");
System.out.println(classroom); // 直接存取靜態變數
Demo8 demo = new Demo8();
System.out.println(demo.schoolName); // 需透過物件存取實例變數
}
public void func() {
System.out.println("=======func=======");
System.out.println(classroom); // 非靜態方法可直接存取靜態變數
System.out.println(schoolName); // 直接存取實例變數
}
public static void main(String[] args) {
System.out.println("=======main=======");
System.out.println(Demo8.classroom);
System.out.println(classroom);
Demo8.getName();
getName();
Demo8 demo = new Demo8();
demo.func();
}
}
類中可包含多個初始化塊,建立物件時依序執行。若用 static 修飾則為靜態初始化塊。
package com.test;
public class Demo9 {
int age;
String name;
static String sex;
public Demo9() {
age = 12;
System.out.println("通過構造函數初始化age");
}
{ // 普通初始化塊
name = "java";
System.out.println("通過初始化塊初始化name");
}
static { // 靜態初始化塊
sex = "女";
System.out.println("通過靜態初始化塊初始化sex");
}
public static void main(String[] args) {
Demo9 demo = new Demo9();
System.out.println("年齡" + demo.age + " 姓名" + demo.name + " 性別" + sex);
Demo9 demo1 = new Demo9(); // 第二次建立物件,靜態初始化塊不再執行
}
}
執行結果:
通過靜態初始化塊初始化sex 通過初始化塊初始化name 通過構造函數初始化age 年齡12 姓名java 性別女 通過初始化塊初始化name 通過構造函數初始化age
掌握類與物件的核心機制——成員變數作用域、構造方法重載、靜態成員共享特性、初始化塊執行順序——是寫出健壯 Java 程式的基礎。實際開發中,善用構造方法保證物件初始狀態合法,合理區分靜態與實例成員,能有效避免記憶體洩漏與邏輯錯誤。