7-5 靜態變數的應用
7-5-1 類別變數 - static 基本上,經由類別產生若干個物件後,各個物件都屬獨立性個體,有自己的記憶體空間、變數成員與方法成員。但某些情況下,我們還是希望同一類別所產生的物件們,之間保留有一些連帶關係。讓物件之間保留關係,最簡單的方法的讓物件之間享有共同的變數成員,此型態變數稱為『靜態變數』(Static variable)或『類別變數』(Class variable)。類別實體內宣告某一個靜態變數(如 static int a;)之後,無論該類別產生多個物件(如 x、y、z...等),靜態變數都指向同一變數(如 x.a、y.a、z.a);也就是說,改變任一物件的靜態變數(如 x.a)的內容,則其他靜態變數的內容也隨之改變(如 y.a 或 z.a);如圖 7-8 所示。
圖 7-12 靜態變數的特性 靜態變數的宣告語法如下:
重點說明如下: (1) 宣告類別變數必須加入 static 關鍵字。 (2) 類別變數同樣具有 public、private 與 protected 屬性。 (3) 宣告範例如下:public static int a、private static String name...等。 7-5-2 範例研討:智慧型庫存管理系統 (A)程式功能:Ex7_2.java 許多經理人都想盡辦法降低庫存量與增加銷售量,來增加公司的獲利,但兩者其實互相衝突。當庫存量不足時,可能會嚴重影響到銷售的順暢性,庫存量太高則會積壓公司資金,如何掌握最恰當的庫存量,實為考驗經理人能力的關鍵,最簡單的方法是隨時掌握目前庫存金額多寡。因此,『春嬌超商連鎖公司』期望建立一套智慧型的庫存管理系統。 該系統允許選擇商品及進貨或出貨數量,進貨用正號(如 +10);出貨用減號(如 -10)。庫存檔案儲存於 product.data 內,每一商品包含四個欄位:{品名、單價、庫存量、金額、總庫存金額}(如 可口奶滋 ),其中 "金額" 為該項產品庫存金額。"總庫存金額" 為所有庫存量的總金額;進出任何商品後,總庫存金額會登錄目前所有金額多寡。除了能滿足一般庫存系統的功能外,也能讓經理人隨時了解目前庫存金額多寡。期望操作介面如下:
(B)製作技巧研討: 吾人將 Product 類別中庫存總金額宣告成類別變數(static int total;),當任何一樣產品變更此內容時,所有產品的 total 值隨之改變。因此,查閱任何一筆資料都可以知道目前總庫存金額多寡。 接著,吾人必須利用編輯工具(如 notepad ++) 建立一個 product.data 庫存資料檔,如下圖所示。進入系統後,它讀取庫存資料。
(C)程式範例:
圖 7-13 Ex7_2 程式架構
(D)程式重點分析 (1) 第 21~40 行:系統啟動後,立即將 Product.data 檔案內所儲存的庫存資料讀入,並儲存於 article[] 物件陣列內,其中利用變數 k 紀錄有多少筆資料。 (2) 第 41~48 行:將 article[] 陣列內容顯示於螢幕上。 (3) 第 49~51 行:將陣列 article[] 內每一筆資料的產品名稱(article[i].name)印出,讓操作者選擇登錄哪一樣產品。 (4) 第 53~63 行:計算操作者所登錄產品的進出貨。 (5) 第 64~71 行:輸出登錄後的庫存資料。 7-5-3 範例研討:停車場管理系統 (A)程式功能:Ex7_3.java 高雄市政府公告『前金立體停車場管理系統』招標事項,該系統需具有下列功能:(假設範例)
參與投標者須建立一套模擬系統,除了可提供上述功能之外,為增加現場臨場感,需增加一項設定目前時間的功能,作為計算停車費的依據。期望雛型模擬系統具有下列操介面: (1) 編譯後,正常執行如下:
(2) 主選單有 5 個選項,選項 1 為顯示目前停車場各輛車的進場時間、選項 2 為模擬計時器,利用人工輸入目前時間、選項 3 是車輛進入停車場,取票與開始計時、選項 4 是車輛離開時,繳費與刪除,如下:
(3) 首先設定目前時間(選項 2),如設定目前時間是 8 時20 分,如下:
(4) 當車輛進入時,會自動產生停車號碼,與登錄當時時間,如下:
(5) 如進入 3 輛車後,顯示目前停車場車輛(選項 1),如下:
(6) 當 2 號車欲離開時,其操作如下(選項 4):
(B)製作技巧提示: 製作此系統時需考慮車輛進出口並不一定會相同,即是系統可能由:入口(車輛進入取票功能)、出口(車輛出場繳費功能)、與管理處(顯示目前停車功能)等 3 個地方同時操作。因此需將儲存停車資料檔案設定成共享資料,為了方便系統設計,我們採用物件導向設計理念,圖 7-9 為資料流程概念圖。首先我們宣告停車票類別(carTicket),描述每張停車票的內容:ticket 與 enterTime[2],前者為停車票號碼、後者為車輛進場時間(時與分)。另外,製作一個停車票紀錄類別 Cars,期望它是共用屬性,因此宣告成靜態類別,所有程式都可直接存取。Cars 類別包含:car[] 與 number,前者紀錄每張停車票的資料,後者紀錄目前停車場的車輛數目。本系統也須設定一個靜態時間類別 Clock,紀錄目前時間。
圖 7-14 範例 Ex7_3 資料流程 (C)相關類別設計(carTicket.java) 依照上述的規劃,我們需要 3 個類別,將其製作於 carTicket.java 檔案,編譯後會分別產生下列 3 個類別檔案(如圖 7-9 所示),功能如下: (1) carTicket.class:停車票類別。功能是記錄停車票號碼,以及車輛進場時間;成員如下: (a) int setTicket():設定停車票號碼的方法。 (b) int getTicket():取得停車票號碼的方法。 (c) enterTime[]:儲存車輛進入時間的變數,可任意存取。 (2) Cars.class:儲存停車票的類別變數,包含有: (a) static carTicket[] car:進入車輛的停車票記錄(靜態變數)。由此記錄可知該車輛何時進入停車場,可做收費的依據。 (b) static int number:紀錄目前停車場的車輛數(靜態變數)。 (3) Clock.class:主時鐘的類別變數。記錄目前時間,包含有: (a) Static int clock:目前幾點鐘(時數,靜態變數)。 (b) Static int minute:目前幾分鐘(分鐘數,靜態變數)。 (4) carTicket.java 原始檔案如下所示:
圖 7-15 carTicket.java 程式架構
(D)主程式範例(Ex 7_3.java)
圖 7-16 Ex7_3 程式架構
|
翻轉工作室:粘添壽
Java 程式設計(二) 含物件導向
翻轉電子書系列:
|