基礎程式設計(Java)· CH6

方法:更深入一層

宣告 · static · 呼叫堆疊 · 多載 · 值傳遞 · 套件/亂數/enum · 導覽地圖

完整內容看 PDF 講義,動手追蹤與試跑看 index。

為什麼用方法

分而治之

拆問題
大問題拆小方法
免重複
寫一次用多次
易維護
改一處即可

方法=有名字、可重複呼叫、完成單一工作的程式碼單位。

宣告

方法的五個部位

public static int square(int x) {
    return x * x;
}
//   修飾子 回傳型別 名稱(參數列) { 方法體 }

參數=宣告括號裡的變數;引數=呼叫時實際傳入的值。不回傳值用 void

static

不需建物件就能用

double r = Math.sqrt(16.0);   // 類名.方法
int big = Math.max(3, 7);     // 不需 new Math()

static 屬類別本身;main 是 static,裡面只能直接呼叫 static 方法(否則先 new 物件)。

呼叫堆疊

push / pop(LIFO)

呼叫
push 活動記錄
到堆疊頂端
return
pop 該記錄
交回值與控制權

最後呼叫的最先返回;每框=一次呼叫的參數與區域變數。疊太深 → StackOverflowError

多載

同名、靠參數列區分

int square(int x)       { return x * x; }   // A
double square(double x) { return x * x; }   // B
square(5);     // → A,得 25
square(2.5);   // → B,得 6.25

參數列(數量/型別/順序)不同才算多載;只改回傳型別不行

傳參數

Java 一律值傳遞

void addOne(int n){ n = n + 1; }   // 改的是拷貝
int a = 5; addOne(a);
// a 仍是 5(基本型別動不到呼叫端)

物件傳的是參照值的拷貝:可改內容(如陣列元素),但換新物件不影響呼叫端。

套件 · 亂數 · enum

用 Java API 寫機率遊戲

import java.security.SecureRandom;
SecureRandom rand = new SecureRandom();
int face = 1 + rand.nextInt(6);    // 擲骰 1~6

private enum Status { CONTINUE, WON, LOST }
Status s = Status.WON;             // 比較用 ==

套件import 找類別(java.lang 自動匯入);亂數 起點 + nextInt(寬度)enum 取代魔術數字。

範疇

區域變數活在哪

參數
整個方法體
區塊變數
只在 { } 內

區域變數沒有預設值,用前須先賦值(實例欄位才有預設值)。

接下來

把方法練到自動

  • PDF 講義 完整內容+呼叫堆疊圖+套件/亂數/enum
  • index 呼叫堆疊步進+試跑+值傳遞
  • 本地練習 5 題 最大/擲骰/enum/多載/static
  • 複習測驗 自測到 90%