昨天學習了 Method,把不同功能分開,讓程式碼變得比較整齊。
今天要開始進入 Java 很重要的一個觀念:物件導向程式設計(Object-Oriented Programming,OOP)。
第一步就是認識 Class(類別)與 Object(物件)。
為什麼需要 Class?
目前我們保存消費資料的方式是:
ArrayList items = new ArrayList<>();
ArrayList amounts = new ArrayList<>();
例如:
items.add("早餐");
amounts.add(60);
這代表「早餐」和「60 元」其實被分開放在兩個不同的 ArrayList 裡。
如果之後還要增加:
消費分類
消費日期
付款方式
可能就會變成:
ArrayList items;
ArrayList amounts;
ArrayList categories;
ArrayList dates;
資料越來越多,就會比較難管理。
所以今天想把「一筆消費」直接整理成一個完整的物件。
什麼是 Class?
我目前的理解是,可以先把 Class 想成一張「設計圖」。
例如一筆消費紀錄需要:
消費項目
消費金額
就可以建立一個 Expense 類別:
class Expense {
String item;
int amount;
}
這代表每一個 Expense 都可以擁有自己的:
item
amount
例如:
早餐 → 60 元
午餐 → 120 元
捷運 → 30 元
都可以分別變成不同的 Expense 物件。
什麼是 Object?
Class 是設計圖,而根據 Class 建立出來的實際資料就是 Object(物件)。
例如:
Expense expense = new Expense();
這行程式建立了一個 Expense 物件。
接著可以放入資料:
expense.item = "早餐";
expense.amount = 60;
完整範例:
class Expense {
String item;
int amount;
}
public class Main {
public static void main(String[] args) {
Expense expense = new Expense();
expense.item = "早餐";
expense.amount = 60;
System.out.println("消費項目:" + expense.item);
System.out.println("消費金額:" + expense.amount + " 元");
}
}
執行結果:
消費項目:早餐
消費金額:60 元
這樣「早餐」和「60」就不再是兩個分開的資料,而是屬於同一個 Expense 物件。
建立多個 Object
既然 Class 是設計圖,就可以使用同一個 Class 建立很多物件。
例如:
Expense expense1 = new Expense();
expense1.item = "早餐";
expense1.amount = 60;
Expense expense2 = new Expense();
expense2.item = "捷運";
expense2.amount = 30;
Expense expense3 = new Expense();
expense3.item = "午餐";
expense3.amount = 120;
這三個都是 Expense 類別建立出來的物件,但是每個物件保存的資料都不一樣。
可以想成:
Expense
│
├── expense1 → 早餐、60 元
├── expense2 → 捷運、30 元
└── expense3 → 午餐、120 元
這樣開始比較有「一筆消費紀錄」的感覺。
今天的小實作:把 Expense 放進 ArrayList
前幾天我們學過 ArrayList。
今天可以把 Expense 和 ArrayList 結合起來:
ArrayList expenses = new ArrayList<>();
以前是:
ArrayList items = new ArrayList<>();
ArrayList amounts = new ArrayList<>();
現在只需要一個:
ArrayList expenses = new ArrayList<>();
就可以保存很多個 Expense 物件。
完整程式
今天先把記帳系統修改成下面這樣:
import java.util.Scanner;
import java.util.ArrayList;
class Expense {
String item;
int amount;
}
public class Main {
static Scanner scanner = new Scanner(System.in);
static ArrayList expenses = new ArrayList<>();
public static void main(String[] args) {
boolean running = true;
while (running) {
showMenu();
System.out.print("請選擇功能:");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
addExpense();
break;
case 2:
showExpenses();
break;
case 3:
running = false;
System.out.println("已離開個人記帳系統!");
break;
default:
System.out.println("輸入錯誤,請重新選擇!");
}
}
scanner.close();
}
public static void showMenu() {
System.out.println();
System.out.println("===== 個人記帳系統 =====");
System.out.println("1. 新增消費");
System.out.println("2. 查看紀錄");
System.out.println("3. 離開");
}
public static void addExpense() {
Expense expense = new Expense();
System.out.print("請輸入消費項目:");
expense.item = scanner.nextLine();
System.out.print("請輸入消費金額:");
expense.amount = scanner.nextInt();
scanner.nextLine();
expenses.add(expense);
System.out.println("記帳成功!");
}
public static void showExpenses() {
System.out.println();
System.out.println("===== 消費紀錄 =====");
if (expenses.size() == 0) {
System.out.println("目前沒有消費紀錄。");
} else {
for (int i = 0; i < expenses.size(); i++) {
Expense expense = expenses.get(i);
System.out.println(
(i + 1) + ". "
+ expense.item + ":"
+ expense.amount + " 元"
);
}
}
}
}
實際執行看看
先新增:
===== 個人記帳系統 =====
再新增:
請輸入消費項目:捷運
請輸入消費金額:30
記帳成功!
選擇查看紀錄:
===== 消費紀錄 =====
使用者看到的結果跟之前差不多,但是程式內部保存資料的方法已經不一樣了。
以前:
items.add(item);
amounts.add(amount);
現在變成:
Expense expense = new Expense();
expense.item = "早餐";
expense.amount = 60;
expenses.add(expense);
這代表「早餐+60 元」現在是一個完整的 Expense 物件。
Class 和 Object 我怎麼記?
今天一開始我覺得 Class 和 Object 有點抽象,所以我用比較簡單的方式記:
Class = 設計圖
class Expense {
String item;
int amount;
}
它規定一筆消費應該有哪些資料。
Object = 根據設計圖建立出來的實際東西
Expense expense = new Expense();
再給它真正的資料:
expense.item = "早餐";
expense.amount = 60;
所以可以簡單理解成:
Expense Class
↓
建立 Object
↓
早餐 + 60 元
Day 11 學習心得
今天開始接觸 Java 很重要的物件導向概念,學習了 Class 和 Object。
一開始覺得這兩個名詞有點抽象,不過把它套用到記帳系統之後,就比較容易理解。Class 就像一張設計圖,而 Object 則是根據設計圖建立出來的實際資料。
以前消費項目和金額需要分開保存,現在可以把它們放進同一個 Expense 物件裡。雖然今天程式執行出來的畫面沒有太大的變化,但是資料的整理方式變得比較完整,也為之後加入更多消費資訊做準備。