Java 靜態變數的應用 - 翻轉工作室
文章推薦指數: 80 %
(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
因此需將儲存停車資料檔案設定成共享資料,為了方便系統設計,我們採用物件導向設計理念,圖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