Java 類別使用指南:欄位、方法、實例化,一次搞懂怎麼用【Thinking in Java筆記(1-2)】

Java 類別使用指南:欄位、方法、實例化,一次搞懂怎麼用【Thinking in Java筆記(1-2)】
Photo by orbtal media / Unsplash
想搞懂 Java 的 class 到底在幹嘛嗎?這篇讓你從頭到尾看懂類別是什麼、怎麼用、為什麼你的 null 會出現錯誤

什麼是 Java 的「類別」?

想像你在玩積木,而類別(Class)就是你設計好的一組模版,例如「小車車模組」。每次想蓋一台車,只需要根據這個模版照做,就能快速產出

在 Java 中,類別就是用來創造「物件」的模版。它定義了一個物件會有哪些資料(欄位),以及能做哪些事(方法)

例如:

class Dog {
  String name;        // 每隻狗的名字
  void bark() {
    System.out.println("汪汪!"); // 每隻狗都會叫
  }
}

這裡定義了一種「狗」的類別。每隻狗都會有名字,並且會叫。這只是模版,還沒真的產生一隻狗

創造一隻狗並使用它的方法:

Dog myDog = new Dog();
myDog.name = "小黑";
myDog.bark();

你就創造了一隻名叫「小黑」的狗,然後叫牠叫一聲。這就是物件導向程式設計的第一步:使用類別模版創造物件

如何定義一個類別

class ATypeName {
  // 這裡放欄位與方法
}

然後用 new 來創造它的實例:

ATypeName a = new ATypeName();

你現在拿到一個 ATypeName 物件

類別的核心結構:欄位與方法

在你開始寫 Java 類別時,會常常看到兩個重要的東西:欄位(Fields)跟 方法(Methods)

  • 欄位:就像是物件的「資料夾」或「口袋」,它們用來存放資料,例如名字、年齡、重量
  • 方法:這個物件「可以做的事」,像是「計算年齡」、「印出訊息」、「叫」

我們來看一個類比範例:如果你有一個 Person 類別,它可能會有:

  • 欄位:name(名字)、age(年齡)
  • 方法:sayHello()(打招呼)、growOlder()(長一歲)

這些組合在一起,構成了這個 Person 類別的基本樣子

欄位 (Fields):物件的資料儲存櫃

欄位是用來儲存一個物件的「狀態」的地方。每個欄位都像是一個變數,但它隸屬於某個物件。舉例來說:如果你有一台車這個物件,它可能會有 顏色時速油量 這些屬性,這些就是欄位

在 Java 裡,欄位會定義在類別中,並且在建立物件之後,就可以透過「物件.欄位」的方式來設定或讀取

範例:

class DataOnly {
  int i;        // 整數型態欄位 i
  double d;     // 小數型態欄位 d
  boolean b;    // 布林型態欄位 b
}

DataOnly data = new DataOnly();  // 創建一個 DataOnly 類別的實例

// 設定欄位的值
data.i = 42;
data.d = 3.14;
data.b = true;

// 讀取欄位的值
System.out.println(data.i);  // 印出 42

每個物件都會有自己的欄位副本,這表示即使你創造了兩個 DataOnly 物件,它們的欄位值也不會互相影響

方法 (Methods):物件會「做什麼」

如果欄位是物件的「資料」,那方法就是物件「可以做的事」。方法是寫在類別裡的功能單元,它就像是這個物件會做的某種動作,或是可以完成的任務

方法的基本語法看起來像這樣:

int add(int x, int y) {
  return x + y;
}

void greet() {
  System.out.println("Hello!");
}
  • int add(int x, int y):這是一個會「加總兩個數字」的功能,它會回傳(return)一個整數
  • void greet():這是一個不回傳任何東西的方法,它會印出一段文字

每個方法都有幾個固定的結構要素:

  1. 回傳型別(像 intvoid
  2. 方法名稱(像 addgreet
  3. 參數列表(放在括號內,像 int x, int y
  4. 方法本體(用大括號 {} 包住裡面的程式碼)

你可以透過「物件.方法()」的方式來執行這些動作。例如:

Calculator calc = new Calculator();
int result = calc.add(3, 5);  // 呼叫 add 方法

這就像你在對這個物件下指令:「嘿 calc 幫我把 3 和 5 加起來。」

欄位沒設定值會怎樣?Java 自動幫你填好了

如果欄位沒有列明設定,Java 會自動賦預設值:

PrimitiveDefault Value
booleanfalse
char'\u0000' (null)
byte(byte) 0
short(short) 0
int0
long0L
float0.0f
double0.0d
這只限於欄位,如果是類別中的變數,Java 會自動提供預設值。但如果是方法裡面的區域變數,則必須手動賦值,否則在編譯階段就會產生錯誤

如何呼叫方法?

當你在程式中寫好一個方法後,如果想要使用它,就要透過「呼叫(Call)」這個方法來執行裡面的程式碼。呼叫方法的方式通常是這樣:

int x = myObject.doSomething(42);

這行程式代表:我們有一個名為 myObject 的物件,我們對它「發送訊息」,請它執行名為 doSomething 的方法,並傳入一個參數 42。方法會執行它裡面的內容,並將結果回傳給變數 x

這裡可以拆解成:

  • myObject 是你之前用 new 建立的某個物件
  • . 是用來呼叫這個物件的方法或欄位的符號
  • doSomething(42) 是方法名稱 + 括號內的參數
你可以把這種呼叫方式想成是:我對這個物件說「請你幫我做這件事」,物件會照方法的定義去做並回應你。

呼叫方法的語法很一致,也可以像這樣:

printer.printPage();
person.sayHello();
math.add(5, 7);

這些都是在叫一個物件「執行它會的動作」。方法也可以不回傳東西(例如 void),或需要好幾個參數,一切都看方法本身怎麼定義

方法、參數與回傳值

你可能會想問:「欸,那段 int add(int x, int y) 到底是什麼意思?」,現在來慢慢拆解給你看

在 Java 裡,一段像這樣的東西:

int add(int x, int y) {
  return x + y;
}

就叫做方法(Method)

  • 它是一種「可以被呼叫來執行某件事」的小程式。
  • 它屬於某個類別(也就是某個物件的功能)。

讓我們一段一段看懂:

int       // 這個方法會回傳一個整數
add       // 方法的名稱,想像是這個功能的名字
(int x, int y)  // 這個方法需要兩個整數做為輸入
{ return x + y; } // 方法的內容,這裡會把兩個數加起來後回傳

這樣的結構是通用的。每個方法都包含:

  • 回傳型別(會回傳什麼資料?沒有就寫 void
  • 方法名稱(你想叫它什麼都行,但不要太亂)
  • 參數列表(要輸入什麼資料給它)
  • 方法內容(本體)(你希望它執行什麼事情)

呼叫方法的時候,參數是怎麼傳進去的?

int result = add(3, 5);

你這樣寫,就是叫 add 這個方法用 35 當作參數去做事。對應到方法內部,它會把 x = 3y = 5,然後算出 8 丟給你

  • 基本型別(像 intboolean)會「傳值」,也就是把資料複製一份丟進去。
  • 物件型別(像 String 或自己寫的類別)會「傳參考」,就像是把某個東西的地址丟進去,雙方共用那一份東西

參數的型別一定要對,不然編譯器會不高興(報錯)

方法的回傳值是什麼?

如果你有一個方法會「產生答案」,就要用 return 把答案丟回去

int square(int x) {
  return x * x;
}

這代表你丟進去一個數字,它會把平方後的結果「回傳」給你

如果你只是做點事情,不需要回傳(比如印一句話),那就可以寫成 void

void greet() {
  System.out.println("Hello!");
}

你呼叫它,它就執行;但它不會回給你任何東西

一個方法 = 回傳型別 + 名稱 + 參數列表 + 方法體。呼叫時記得依照定義傳參數、接回傳值。

理解這些基本構造,是學習 Java 類別與物件操作的重要基礎

總結

  • 類別 = 物件模版
  • 欄位 = 物件資料
  • 方法 = 物件功能
  • 預設值只有欄位有
  • 方法名 + 參數 = 簡章