Java 靜態變數的應用 - 翻轉工作室

文章推薦指數: 80 %
投票人數:10人

(2) 類別變數同樣具有 public、private 與 protected 屬性。

(3) 宣告範例如下:public static int a、private static String name...等。

 Java 程式設計(二)  :第 七章類別與物件產生  上一頁    下一頁   7-5靜態變數的應用 內容: 7-5-1類別變數-static 7-5-2範例研討:智慧型庫存管理系統 7-5-3範例研討:停車場管理系統 7-5-1類別變數-static 基本上,經由類別產生若干個物件後,各個物件都屬獨立性個體,有自己的記憶體空間、變數成員與方法成員。

但某些情況下,我們還是希望同一類別所產生的物件們,之間保留有一些連帶關係。

讓物件之間保留關係,最簡單的方法的讓物件之間享有共同的變數成員,此型態變數稱為『靜態變數』(Staticvariable)或『類別變數』(Classvariable)。

類別實體內宣告某一個靜態變數(如staticinta;)之後,無論該類別產生多個物件(如x、y、z...等),靜態變數都指向同一變數(如x.a、y.a、z.a);也就是說,改變任一物件的靜態變數(如x.a)的內容,則其他靜態變數的內容也隨之改變(如y.a或z.a);如圖7-8所示。

圖7-12靜態變數的特性 靜態變數的宣告語法如下: classproduct{   …..   staticinttotal; } 重點說明如下: (1)宣告類別變數必須加入static 關鍵字。

(2)類別變數同樣具有 public、private與 protected屬性。

(3)宣告範例如下:publicstaticinta、privatestaticStringname...等。

7-5-2範例研討:智慧型庫存管理系統 (A)程式功能:Ex7_2.java 許多經理人都想盡辦法降低庫存量與增加銷售量,來增加公司的獲利,但兩者其實互相衝突。

當庫存量不足時,可能會嚴重影響到銷售的順暢性,庫存量太高則會積壓公司資金,如何掌握最恰當的庫存量,實為考驗經理人能力的關鍵,最簡單的方法是隨時掌握目前庫存金額多寡。

因此,『春嬌超商連鎖公司』期望建立一套智慧型的庫存管理系統。

該系統允許選擇商品及進貨或出貨數量,進貨用正號(如+10);出貨用減號(如-10)。

庫存檔案儲存於product.data內,每一商品包含四個欄位:{品名、單價、庫存量、金額、總庫存金額}(如可口奶滋),其中"金額"為該項產品庫存金額。

"總庫存金額"為所有庫存量的總金額;進出任何商品後,總庫存金額會登錄目前所有金額多寡。

除了能滿足一般庫存系統的功能外,也能讓經理人隨時了解目前庫存金額多寡。

期望操作介面如下: D:\Java2_book\chap7\Ex7_2>javacEx7_2.java   D:\Java2_book\chap7\Ex7_2>dir/b Ex7_2.class                               【主程式類別】 Ex7_2.java                               【主程式檔案】 Product.class                              【產品類別】 Product.data                              【產品資料檔案】   D:\Java2_book\chap7\Ex7_2>javaEx7_2 **** 未登錄前庫存量 *** 品名            單價    庫存量  金額    總庫存金額 可口奶滋        20     50     1000   2780 黑松汽水        12     40     480    2780 味全鮮乳        15     50     750    2780 頻果西打        8      80     640    2780   (1) 可口奶滋    (2) 黑松汽水    (3) 味全鮮乳    (4) 頻果西打         請輸入貨品編號(或大於 5 離開) =>4          進出貨數量 =>20 品名            單價    庫存量  金額    總庫存金額 可口奶滋        20     50     1000   2940 黑松汽水        12     40     480    2940 味全鮮乳        15     50     750    2940 頻果西打        8      100    800    2940 總庫存金額(product.total) =2940 (B)製作技巧研討: 吾人將Product類別中庫存總金額宣告成類別變數(staticinttotal;),當任何一樣產品變更此內容時,所有產品的total值隨之改變。

因此,查閱任何一筆資料都可以知道目前總庫存金額多寡。

接著,吾人必須利用編輯工具(如notepad++)建立一個product.data庫存資料檔,如下圖所示。

進入系統後,它讀取庫存資料。

D:\Java2_book\chap7\Ex7_2>typeproduct.data 可口奶滋       20     50     1000   2780 黑松汽水       12     40     480    2780 味全鮮乳       15     50     750    2780 頻果西打       8      80     640    2780 (C)程式範例: 圖7-13Ex7_2程式架構 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 //Ex7_2.java   importjava.io.*; importjava.util.Scanner; classProduct{     Stringname;         //產品名稱     intprice;           // 單價     intstorage;         // 庫存量     intdeposit;          // 金額     staticinttotal;    // 庫存總金額(類別變數) }   publicclassEx7_2{    publicstaticvoidmain(Stringargs[])throws IOException{       Product[]article=newProduct[20];       Scannerkeyin=newScanner(System.in);       Stringfile="Product.data";       StringinData;       intk=0,select,count;       FilefileID=newFile(file);       if(fileID.exists()){           BufferedReaderdata=newBufferedReader(new                                       FileReader(fileID));           while((inData=data.readLine())!=null){               Scanners=new Scanner(inData).useDelimiter("\t");               article[k]=newProduct();               article[k].name=s.next();               article[k].price=s.nextInt();               article[k].storage=s.nextInt();               article[k].deposit=s.nextInt();               article[k].total=s.nextInt();               k=k+1;           }           data.close();      }      else{           System.out.printf("%sfilenotexisted\n", file);           return;      }      System.out.printf("**** 未登錄前庫存量 ***\n");      System.out.printf("品名\t\t單價\t庫存量\t金額\t總庫存金額\n");      for(inti=0;i");      select=keyin.nextInt();      if(select<5){          System.out.printf("\t 進出貨數量 =>");          count=keyin.nextInt();          ints1=select-1;          intm1=article[s1].price*count;          article[s1].storage=article[s1].storage+ count;          article[s1].deposit=article[s1].deposit+m1;          article[s1].total=article[s1].total+m1;      }      System.out.printf("品名\t\t單價\t庫存量\t金額\t總庫存金額\n");                    for(inti=0;ijavacCustomer.java    【編譯Customer.java】 D:\Java2_book\chap7\PM7_1>javacPM7_1.java      【編譯PM7_1.java】 D:\Java2_book\chap7\Ex7_3>javaccarTicket.java     【編譯carTicket.java】 D:\Java2_book\chap7\Ex7_3>javacEx7_3.java        【編譯Ex7_3.java】   D:\Java2_book\chap7\Ex7_3>dir/b       【產生相關檔案4 個類別】 Cars.class                                    【停車場車輛物件】 carTicket.class                                【停車票物件】 carTicket.java Clock.class                                   【公用計時物件】 Ex7_3.class                                   【主類別】 Ex7_3.java (2)主選單有5個選項,選項1為顯示目前停車場各輛車的進場時間、選項2為模擬計時器,利用人工輸入目前時間、選項3是車輛進入停車場,取票與開始計時、選項4是車輛離開時,繳費與刪除,如下: D:\Java2_book\chap7\Ex7_3>javaEx7_3 **高雄市前金立體停車場管理系統目前時間0時0分** (1)顯示目前停車     (2)設定目前時間 (3)車輛進入取票     (4)車輛出場繳費 (5)離開系統 目前車輛0請輸入工作選項=> (3)首先設定目前時間(選項2),如設定目前時間是8時20分,如下: 目前車輛0請輸入工作選項=>2 請輸入目前時間(時/分)=>08/20   **高雄市前金立體停車場管理系統目前時間8時20分** (1)顯示目前停車     (2)設定目前時間 (3)車輛進入取票     (4)車輛出場繳費 (5)離開系統 (4)當車輛進入時,會自動產生停車號碼,與登錄當時時間,如下: 目前車輛0請輸入工作選項=>3 請按鍵取票(票號:1)=> (5)如進入3輛車後,顯示目前停車場車輛(選項1),如下: 目前車輛3請輸入工作選項=>1 停車票號               進入時間 1              8時20分 2              9時10分 3              9時40分   **高雄市前金立體停車場管理系統目前時間9時40分** (1)顯示目前停車     (2)設定目前時間 (3)車輛進入取票     (4)車輛出場繳費 (5)離開系統 目前車輛3請輸入工作選項=> (6)當2號車欲離開時,其操作如下(選項4): 目前車輛3請輸入工作選項=>4 請出示停車票=>2 請繳交20停車費(按鍵)=>   **高雄市前金立體停車場管理系統目前時間9時40分** (1)顯示目前停車     (2)設定目前時間 (3)車輛進入取票     (4)車輛出場繳費 (5)離開系統 目前車輛2請輸入工作選項=> (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) intsetTicket():設定停車票號碼的方法。

(b) intgetTicket():取得停車票號碼的方法。

(c)enterTime[]:儲存車輛進入時間的變數,可任意存取。

(2)Cars.class:儲存停車票的類別變數,包含有: (a) staticcarTicket[]car:進入車輛的停車票記錄(靜態變數)。

由此記錄可知該車輛何時進入停車場,可做收費的依據。

(b) staticintnumber:紀錄目前停車場的車輛數(靜態變數)。

(3) Clock.class:主時鐘的類別變數。

記錄目前時間,包含有: (a) Staticintclock:目前幾點鐘(時數,靜態變數)。

(b) Staticintminute:目前幾分鐘(分鐘數,靜態變數)。

(4) carTicket.java原始檔案如下所示: 圖7-15carTicket.java程式架構 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 //carTicket.java   /* 停車票  */ classcarTicket{    privatestaticintcount=0;    privateintticket;      // 停車票號碼    int[]enterTime=newint[2];     // 進入停車場時間        intsetTicket(){                // 設定停車票號碼        count++;        ticket=count;        returnticket;    }    intgetTicket(){                // 取得停車票號碼        returnticket;    } } /* 目前停放車輛 */ classCars{    staticcarTicket[]car=newcarTicket[100];    staticintnumber; } /*公眾計時器 (利用設定輸入) */ classClock{     staticinthour;     staticintminute; } (D)主程式範例(Ex7_3.java) 圖7-16Ex7_3程式架構 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 //Ex7_3.java /* 請建立一套停車場管理系統,功能有:顯示目前停車車輛、    車輛進入取票、車輛出場繳費 */   importjava.io.*; importjava.util.*; publicclassEx7_3{    staticScannerkeyin=newScanner(System.in);    publicstaticvoidmain(Stringargs[]){         Cars.number=0;         intselect=get_menu();         while(select!=5){             switch(select){                  case1:      // 顯示目前停車                       disp_cars();                       break;                  case2:     // 設定現在時間                       set_time();                       break;                  case3:      // 車輛進入                       enter_car();                       break;                  case4:         // 車輛出場                       outer_car();                       break;                  default:                       System.out.printf("錯誤選擇, 請重新輸入\n");             }             select=get_menu();         }    }      /* 主功能表選單 */    staticintget_menu() {        System.out.printf("\n** 高雄市前金立體停車場 管理系統 目前時間");        System.out.printf("%d 時 %d 分 **\n",Clock.hour,Clock.minute);        System.out.printf("(1) 顯示目前停車      (2) 設定目前時間\n");        System.out.printf("(3) 車輛進入取票      (4) 車輛出場繳費\n");        System.out.printf("(5) 離開系統\n");        System.out.printf("目前車輛 %d 請輸入工作選項 =>",Cars.number);        intselect=keyin.nextInt();        keyin.nextLine();        returnselect;    }      /* 顯示目前停車車輛 */    staticvoiddisp_cars(){        System.out.printf("停車票號\t\t進入時間\n");        for(inti=0;i");        Stringnow=keyin.nextLine();        Scanners=newScanner(now).useDelimiter("/");        Clock.hour=s.nextInt();        Clock.minute=s.nextInt();    }      /* 車輛進場 */    staticvoidenter_car(){         Cars.car[Cars.number]=newcarTicket();         Cars.car[Cars.number].setTicket();         Cars.car[Cars.number].enterTime[0]=Clock.hour;    //記錄時         Cars.car[Cars.number].enterTime[1]= Clock.minute;   // 記錄分         intticket=Cars.car[Cars.number].getTicket();         System.out.printf("請按鍵取票 (票號:%d) =>",ticket);         keyin.nextLine();         Cars.number=Cars.number+1;              // 下一輛號碼     }       /* 車輛出場, 繳費 */     staticvoidouter_car(){         System.out.printf("請出示停車票 =>");         intticket=keyin.nextInt();         keyin.nextLine();         intflag=0,i;         for(i=0;i鍵) =>",tax);        keyin.nextLine();    } }   翻轉工作室:粘添壽   Java程式設計(二)含物件導向 第一章 JDK安裝與開發步驟 第二章一維陣列 第三章 二維陣列 第四章 陣列資料結構 第五章 物件變數與物件陣列 第六章 檔案輸入與輸出 第七章類別與物件產生 7-1 物件導向設計理念 7-2類別的產生 7-3物件的產生 7-4 自我挑戰:驗證身分證號 7-5靜態變數的應用 7-6專題研討:儲蓄存款系統 第八章方法與方法庫產生 第九章繼承性與多形性運用 第十章例外處理 第十一章Java+MySQL專題研討:銀行存款系統     翻轉電子書系列: 資訊與網路安全技術 Java程式設計(一)含程式邏輯 Java 程式設計(二)含物件導向 資料庫程式設計-PHP+MySQL 資料庫系統概論(含邏輯設計) 網路規劃與管理技術 電腦網路與連結技術 TCP/IP協定與Internet網路 電子商務安全概論 Linux伺服器管理-CentOS Unix/Linux系統管理實務       



請為這篇文章評分?