2010年7月28日 星期三

科技評論–嵌入式系統發展概觀 2010/07/26



一:前言



進入科技業就得要有每天接收爆炸般的資訊,每天都會有新
的產品推發表、

新的技術推出、新的創意被實現...。這同時是科技業迷
人與另人頭大的特點。

雖然說每天都在變都有新東西推出,但實際上科技業的根本
的概念與趨勢並不是

每天都在update,依我的經驗大約三年才會有一波大
革命與重點的巨變。在者

這些巨大的改變中,只有很少是全新改變,大多都是一個科
技領域的輪動。也就


是一些早前被人提出來或曾經推動過的技術,在當時的時空
條件下可能是 Fail

了該領域就突然冷凍掉,但過了幾年剛好在天時地利人合下
就爆發了,同時也造

成了產業界大家一起都動起來了。所以把時間拉長來看,重
點是在於能夠抓住趨

勢的大方向,而不是每天在苦苦追趕那些小改變。而趨勢的
大方向往往又能從過

往歷史經驗中看出一些端倪。這也就是科技業那麼有趣的地
方,你永遠都不會想

到一些以前被冰凍冷門的領域或產品,突然可能過個幾年就
爆紅了,但紅了之後


挑戰者也會跟的很快,沒跟上腳步或事先準備好的人,很容
易就會三年一波的大

轉變中被這個生態給暫時冷凍了(你學的領域或專長突然變
冷門了),然後前一

波被冷凍的人又突然變的很熱門(但這時你的年記也跟著增
長了),所以只要一

不小心被冷凍過一次,解凍後就不在新鮮了,更別說被冷凍
過 2次 or3次的人有

多難生存(這就是 RD的宿命)。



再舉個簡單的例子讓大家更深入了解嵌入式系統產業的狀況
。試想在一個衝


浪聖地,有一群人(系統廠)各自拿著不同的衝浪板(De
vices H/W)在海上等著大

浪的來襲。通常每一波的大浪的中間會間隔著許多的小浪頭
(每日的科技新聞與

資訊潮)。衝浪者(系統廠)必須在浪頭從遠方傳來時,當
下快速的判斷是大浪還

是小浪(是有賺頭還是賠錢貨)?這波浪要不要衝下去(領
導需要有獨到的眼光,

敏捷的反應速度,所以大企業的反應速度不見得比較快)。
但有時你會判斷失誤

(不小心壓錯寶);遠遠看來只是一波沒搞頭的小浪頭,誰
知等到快靠近時浪頭突


然湧起變成一道完美的浪波(某項革命性 or殺手級的產品誕生),但這時你己來

不及反應了,只能眼爭爭的看著身旁提早準備好動作的同伴
呼嘯而過。但跟上浪

頭的也不一定就能一路沖回岸上,有的技巧比較不穩(小企
業雖然反應快速,但

規模與穩定性與經驗也較不足)的很可能在過程中站不穩就
翻船了。在者往往大

浪頭並不會是獨行而來,一般會伴隨著 2波的大浪以一群方式(趨勢是由數個重

大的革命性產品 or殺手級庄用所集體造成的)的到來,所以雖然無法跟上
第一

波(領頭的殺手級產品),但隨後馬上就還會有 2波的機會(產業趨勢慢慢成型),


有的體力超強的(資本雄厚的大企業)好手,雖然只跟到第
二波,但靠著自身的

體能用力的往前滑,還是有機會可以出頭趕上第一波的同伴
,但如果這時的你的

反應還是慢半拍,無法跟上後續的機會,那就只能靠著你身
邊所有的同伴一起隨

著那一群大浪依續的回岸上,海上只獨留你在那繼續等下一
群大浪的機會。以

跟對浪頭是很重要的,有時你跟了二,二個小浪只推進了二
百公尺,但後面的同

伴只要跟上一個對的大浪,雖然出發時間比你晚,但可能一
口氣就能超越你數百


公尺,甚至直接就回岸上去和你說再見了。



在本週的週報中,將會針對 Embedded做一系列的整理與報導。將會從

Embedded System發展歷史介紹到未來的趨勢發展,讓大家能夠
對這個產業有更

深入的了解。





二:何謂Embedded System

若有人告訴你,現在我們都是生活在一個充滿嵌入式系統的
年代,每天都有


大量的嵌入式系統 24小時不停的在為我們服務著,不知你是否會感到吃驚呢


但事實就是如此,在我們週遭身邊如:手機、手錶、冰箱、
電視、搖控器、遊戲

機..等等許多生活上的用品都己見的到嵌入式的身影,任
何人身上都可能擁有

許多各式各樣的嵌入式裝置,小至 Mp3隨身聽、手錶與手機等手持式數位裝置,

大至車用電腦、資訊家電、航空系統,這些嵌入式系統裝置
在數量上其實己遠遠

超過傳統電腦,並且己與我們的日常生活密不可分。嵌入式
系統可說是繼個人電


腦與網路的發明後,資訊產業裡一項相當重要的發明。其中
最重要的因素為嵌入

式系統無論在體積、功能、可靠性、功率消耗、內核大小與
成本都具有相當的優

勢,相當適合用來開發資訊家電或是小型的手持式裝置,而
這些產品所提供服務

通常都與我們的日生活有關,因此嵌入式裝置可以很快的進
入我們的生活之中。

只要在生活上留心注意一下,其實並不難發現嵌入式系統的
蹤跡,如圖 1.1都是

一些我們常見的嵌入式產品。








嵌入式系統的特色

對於以往只能在固定地點,固定的方式取得資訊的方式,己
經不足以滿足現

代人的需求,取而代之的是將資訊系統容入我們的日常生活
當中,讓我們能不受

時間與地點的限制,隨時隨地都能取得我們想要的資訊與服
務。而為了擺脫傳統

電腦體積過大,價格過高,且不易隨身攜帶..等等問題,
嵌入式系統這個名詞


也就慢慢的浮上台面。而所謂的嵌入式系統,是指將電腦技
術、半導體技術與電

子技術等,拿來與各種功能需求做具體應用、相互結合後的
產物,是一門綜合技

術的科學。「嵌入式系統」採用的是微處理器,去實現單一
或特定功能的需求,

其中作業系統可有可無,所以往往不需要大量的週邊設備,
因而在體積與功率上

有其自身的優勢。另外為了提高其執行速度與系統可靠性,
嵌入式系統中的軟體

一般都燒錄在記憶體晶片中,而非存貯於磁碟中。若與個人
PC相比,嵌入式系


統就是為單一特定功能與需求而量身定做的產品,而個人 PC則是一個可以滿足

眾多功能需求的一個肥胖的綜合體。

目前嵌入式系統設備大至可分為以下幾類:



●網路設備

網路設備包函路由器、交換器、網頁伺服器、無線 AP..等等各種基於網

路應用的設備,由於近年來無線網路的掘起,未來嵌入式系
統與網路結合應該是

個必然的趨勢。




●行動計算設備

行動計算設備包函:手機、PDA、筆記型電腦..等各種
可移動的資訊設備。

而像智慧型手機、PDA,由於可提供相當多樣性的服務供
使用者做選擇,在加上

體積小、攜帶方便,價格越來越便宜,在近幾年發展相當迅
速。人們可以利用此

類設備隨時隨地的接收各類所需的資訊。



●資訊家電


由於資訊產品慢慢的融入我們的生活之中,現今許多家電用
品己向數位化發

展,在未來電視、冰箱、冷氣、電話、微波爐等我們日常生
活中常見的用品,都

將能利用嵌入式系統與網路路結合,如此一來便可以利用手
機或網路遠端控制或

監視家中的電器用品。



●工業控制、模擬

由於工業控制系統對隱定性與可靠度都相當要求,在加上工
業上一些功能需


求較為等別,因此嵌入式系統在工業控制領域之中,早己受
到相當廣泛的應用,

例如工業機械手臂、工廠自動化控制系統等都皆為嵌入式系
統提供了相當大的市

場。



●家庭娛樂產品

近年來多有許多娛樂產品都己可以看到嵌入式系統的身影,
例如當紅的電子

寵物、電子機器人甚至是樂高玩具,都是藉由嵌入式系統讓
原本沒有生命的玩


具,可以擁有獨特的生命力,並與人類能有所互動,另一方
面電子遊戲機像是

Wii、Xbox或 Ps3也同樣都是屬於嵌入式產品。





三:Embedded System發展史

嵌入式系統存在其實並非這幾年的事,事實上這個概念存在
己久,從七零年

代單晶片的出現到現在嵌入式系統被廣泛的應用,算一算應
該也有三十幾年的時

間了,嵌入式系統的架構也隨著科技的發展不進的演進,




●單晶片時代:

嵌入系統的概念隨著電子工業的發展,原本是獨立分開的微
處理器、儲存裝

置(RAM、ROM)與 I/O界面等元件,都己有能力能全部都集合在一片 VLSI積體電

路之中,因此就開始有 IC製造商開始開發這類的整合型晶片,並且一推出很快

的就廣泛的應用在嵌入式的領域之中。很快的針對嵌入式系
統的 CPU也相繼的問

世,此類 CPU強調的是高度的可靠性與低功率消耗,所以相當附合
當時嵌入式系


統的需求,此時嵌入式系統的潛力漸漸的受到人們的重視,
開始有大量的程式設

計師投入設計簡單的嵌入入式系開發軟體與作業系統,除了
可以提升軟體開發的

效率外,也同時大幅降低了產品開發週期,因此有許多產品
也都轉向利用嵌入式

系統架構來開發。



●即時作業系統產生:

隨著時代發展,數位通訊與資訊家電等許多新的概念被提出
來,而這些概念


都需要利用到嵌入式系統,因此在這個時期嵌入式系統發展
相當的迅速,硬體能

力相當的也提高了不少,也有些產品如 DSP數位信號處理器,開始向高速度、高

穩定性、高精確度等方面發展。同時在硬體與應用層面的需
求不斷的提高的情況

下,嵌入式系統軟體的架構也必須跟著提升以提供更完整的
服務,漸漸的即時作

業系統(RTOS)開始被大量被導入於嵌入式系統領域之
中。而所謂的即時作業系

統是指當系統收到命令指令時必須立即的產生回應,因此作
業系統的即回應能力


在此得到相當大的改善,在加上作業系統所支援的微處理器
(CPU)種類也相當的

完整,很快的 RTOS開始成為嵌入式系統的主流。在此時針對嵌入式系
統應用軟

體也有顯著的發展,例如:檔案系統、網路、使用者介界面
(GUI)與資源管理等

功能,並且提供了大量的應用函式庫(API),讓嵌入式
軟體開發方面可以更加的

容易有效率。



●網際網路時代。


網際網路無疑的是一個資訊界中相當重要的發明,直至目前
,網路際網路還

是一個相當熱門的產業,在未來嵌入式系統必然也會應用到
各種網路環境中,因

此將網路功能整合進嵌入式系統中便成為一項相當重要的議
題。目前大多數的嵌

入式系統都還處於 Internet之外,但隨著資訊家電與嵌入式技術不斷
的發展,

嵌入式設備與 Interner結合是必然的做法,當然這對嵌入式系統
廠而言也是一

項新的挑戰。




●智慧型作業系統時期

以往嵌入式的作業系統與 PC所使用的作業系統是完全不同的領域,在 PC

上,你可以安裝你喜愛的應用程式,可以播放你愛聽的音樂
or電影,或是利用

browser上網吸取網路資訊,你可以在 PC OS上做任何你想要做的事情,只要有

對應的軟體安裝上去即可。但在早期的嵌入式系統是相對封
閉與功能專用化的系

統,在上面一般是無法自行去安裝各種不同的應用程式,就
算可以安裝,你也要


找到有人幫你寫該平台上的軟體。因為嵌入式平台的整合並
沒有一套準備的軟體

框架,雖然說大家可能都是用 ARM的 CPU,都是跑著 Linux的作業系統,但上層

軟體的框架卻是每個系統廠商自己去開發組合的。每個系統
廠都有自己的軟體框

架,而且互相是不相容的,也不會有提供介面讓你自行去開
發與安裝應用程式,

因為軟體框架是各個不同公司的 know-how,大家互相都是競爭的關係更不可能

互相開放平台給對手使用。



但這幾年拜 IPhone和 Android所賜,現在的狀況己有很大的不同。IPh
one


提供的雖然是封閉的軟體框架,只能在 Apple的產品上使用,不過 Iphone的創

新與很優秀的的使用者體驗經驗,雖然他只開發了 Apple自己的軟體框架,但卻

己經吸引了無敵的開發者來為他開發專屬的軟體,同時也吸
引了大量的用戶來學

習使用這種全新的使用體驗。你,可以自己決定在你的手機
上安裝你所需要的軟

體,而且還有一堆人來幫你寫你要的應用程式,這是以往的
嵌入式系統中所沒有

的創舉。而 Android呢,它可是一個完全開放的軟體框架平台,
所以不只是能

在手機上有所發揮,在其他領域的嵌入式系統中也都有機會
看到它的身影,例如


電視(Google TV),冰箱,吸塵器、視訊電話,門禁系統,超商 POST系統...

都有可能被植入 Android平台。一但植入了 Android平台後,代表的就一個全

新的標準軟體框架產生一統江湖了,軟體開發者可以獨立於
H/W平台之外去開發

應用程式,並且可以安裝在各家不同系統廠的 H/W上執行,也就是系統廠慣用的

用H/W綁軟體(Firmware)去販賣的模式很快就
會被打破,軟體和硬體變成可以分

開買,此時做 H/W就變的不在值錢,用戶也不會因為被綁住就算該系統
廠推出的

Firmware寫的很差很爛,還是只能upgrade
更新同一家系統廠所出的 Firmware


or軟體。嵌入式系統軟體的價質不在會是與 H/W的價質綁在一起。軟體的價質

將會因差異化的改變而日漸升高,而 H/W的價質會漸漸的變的每家都差不多(因

H/W成本的差異化不大)。





四:Embedded System的系統結構

一般而言,整個嵌入式系統的體系架構可以分成四個部分︰
硬體平台、驅動

程式、嵌入式作業系統和嵌入式應用軟體,如下圖所示。而
目前的 Android平台


最主要的差別就在於 Linux OS層之上,另外又提供了一層標準的 SDK開發框架

(Middleware),因此你可以使用 Android的作業系統放在不同的硬體平台上,但

軟體還是可以在 Middleware層很順利的執行。而 IPhone的差別在於它是直接提

供 iOS的 Applications層的標準開發框架,因為它是個
封閉的 H/W平台,軟體

只能跑在 Apple的機器上,所以自然不用在 iOS在架一層middleware。











●嵌入式硬體平台:


嵌入系統硬體平台大至上包含了微處理器(CPU)、儲存
裝置(RAM、ROM)、通

訊裝置(RS232、USB、Bluetooth)與週
邊裝置(keyboard、mouse)四大部份。微處

理器可說是嵌入式系統的核心,嵌入式系統所使用的微處理
器與一般處理器最大

不同處在於,嵌入式 CPU通常都是運作在為特殊需求所專門設計的系統之中,


設計時必須能具備小型化還要同時有很高的可靠性與穩定性
。目前有相當多的

IC製造商都有生產嵌入式系統處理器,而有些軟體公司也
開始採用自己行設計


的處理器,因此嵌入式系統的處理器可以是五花八門,並沒
有一定的標準,目前

市面上比較流行的處理器構架大至上有:ARM、MIPS
、PowerPC。嵌入式硬體平台

中除了微處理器外,另一個重要的元件就是儲存裝置,主要
是應用於資料的儲

存,同樣的儲存裝置的種類也相當的多,比較常見的有 RAM、SRAM、DRAM、ROM

與 FLASH,其中 FLASH因存取速度快、可.寫次數量高、儲存容量大與
價格便宜

等多項價點,在嵌入式領域中被大量的採用。通訊裝置可以
說是嵌入式系統對外


溝通的窗口,目前嵌入式系統可採用的通訊裝置己相當的廣
泛,包含 RS232、

USB、I2C、SPI、IrDA、Ethernet、
Bluetooth等,機乎一般常見的通訊介面都

可以採用於嵌入式系統上。對於部份比較特殊的嵌入式設備
可能需要與其他的週

邊裝置溝通,此時就可以透過通訊裝置對外部週邊裝置進行
存取,例如液晶顯示

器(LCD)、觸控式面版、鍵盤(key board)、滑鼠(Mouse)等。



●驅動程式:


嵌入式系統的硬體平台與一般的計算機平台不同,通常硬體
平台會隨著產品

的需求不同而有所差異,像是嵌入式處理器的種類就己多的
另人數不清,因此嵌

入式硬體裝置通常都必須依照不同的硬體平台,提供相對應
的趨動程式。目前己

有許多硬體開發廠針對不同的硬體平台提供許多的驅動程式
可供選擇,而嵌入式

作業系統通常也對各種主流的硬體設備提供驅動程式支援,
所以除非使用到一些

較特殊或自行開發的硬體裝置,才需要自行撰寫相關的驅動
程式。




●作業系統或中界軟體

作業系統在嵌入式系統中可有可無,部份無作業系統的平台
則是採用中界軟

體(MiddleWare)來與底層的硬體設置做溝通,
中界軟體可能是一套針對該平台硬

體所撰寫的程式函式庫(API),上層的應用程式可以直
接利用此函式庫來存取控

制底層的記憶體、週邊裝置與通訊裝置,這樣做法因為少了
作業系統所以系統可

以相當的精簡,所需的資源也相對的較低。另一種方式則是
採用嵌入式作業系統


做為軟體與硬體中間的管理者,作業系統通常包硬體相關的
底層驅動程式、通訊

協定、記憶體管理、使用者界面(GUI)等。採用嵌入式
作業系統雖然在系統的資

源消耗上較吃重,但卻能擁有許多的優點如:能有效率的自
動管理複雜的系統資

源,提供函許多的驅動程式與開發工具等。



●應用程式

嵌入式系統應用程式軟體與一般的軟體並不盡相同,由於嵌
入式系統主要是


針對特定的應用領域,並運行於一固定的硬體平台,因此部
份嵌入式應用軟體會

與硬體平台或作業系統有所關連,可能是必須控制到底層的
硬體部份,有可能是

需要作業系統提供一些特別的支援。所以開發嵌入式應用程
式除了要具備高度可

靠性、穩定性與安全性外,還要盡可能的對程式進行最佳化
,減少空間的消耗,

與提高執行時的效率,這些種種小細節都可能會影響產品硬
體開發時的成本,例

如若能將程式碼的空間減少,執行效率提高,那硬體相對的
就可以採用較小的記


憶體裝置,CPU的運算能力也能改採用較低的,當產品的
製造量很大時,所能省

下的成本花費就相當可觀。



而最近的改變了上述早期對嵌入式系統的定義,在一些較高
階的嵌入式系統

產品中(有 OS的,一些多媒體相關的devices),將會有機會
擁有的是統一的軟

體開發框架。但一些小型的嵌入式系統(沒有 OS的)還是會維持傳統的架構。






五:Embedded System的開發流程

由於嵌入式系統產品所屬平台,也就是目標平台(Targ
et)可能與與我們的本

地端(Host)開發環境所屬的平台不同,因此嵌入式系
統的開發方式較為特別。在

傳統的程式開發方式中,由於開發與執行都屬同一平台環境
,但在嵌入式系統中

則是需要在 PC上寫出能在另一個平台上執行的程式,目標平台與本地
端平台的

關係就如下圖所示:












因此在開發前必須先了解目標平台所屬的環境與需求,接著
在本地端建置一

套開發環境,其中可能包含了模擬器、各類不同的模組、使
用者介面、軟硬體規

劃等,接著在利用這些工具建置目標平台上程式,並在將程
式利用網路、RS232

或其它傳輸介面,將程式傳送至目標版上執行並進行驗證,
下圖為一般嵌入式系


統的開發流程:







本圖文內容為

Jarey版權所有,禁止任意轉載與拷貝動作,如有需要
請事先知會作者。







這些步驟完全不同於傳統程式開發方式,也因為這樣讓嵌入
式系程式開發上


具有一定的門檻。有別於傳統軟體工程師或硬體工程式只需
了解軟體或硬體方面

的相關技術,嵌入式系統的開發人員必須同時具備軟體、硬
體知識以及系統整合

的觀念,將其整合成一套具有特定功能的系統。然而就目前
而言,這類的人材依

然是非常的缺乏,產品開發上也依然存在的許多的瓶頸,所
以嵌入式系統可說是

非常具有前景與挑戰的一項技術。





關鍵技術:


嵌入式系統是一個技術密集、資金密集的系統,需整合計算
機、半導體、電

子技術與各式的軟體做整合,因此入式系統的開發競爭相當
的激烈,以下為所需

整合的各類關鍵技術:



●核心空間:

嵌入式系統一般都應用於小型電子裝置,因此系統可利用的
資源相當有限

(如記憶體空間、CPU運動速度),所以的內核必須相當
的小,且有效率,通常嵌


入式系統的核心都只有數十 k有的內核甚至可以達到 10k以下。



●功能導向:

嵌入式系統通常都是為一個單一功能,特殊應用所設計的,
在軟硬體設計時

必須減化不必要的部份,加強需求部份的執行效能,針對單
一應用層面去設計出

最佳化的運作效能。



●效能最佳化:


嵌入式系統通常對時間的要求相當的嚴格,具有一定即時性
的保障,為了提

升執行速度、系統效能與可靠性,一般嵌入式系統存儲與執
行都是採用電子式儲

存元件,而非一般的機械式儲存裝置(如硬碟)。雖然現在
硬體技術不斷的在提

升,但嵌入式系統基於運算速度、儲存空間與開發成本上的
考量,因此對軟體的

要求也相對比較嚴謹,像是可靠度、穩定性、執行效率、執
行空間需求等都是必

須要注意的部份。




●系統精簡化:

嵌入式系統中的軟體開發無論是系統軟體或應用軟體,都應
力求精簡,一個

過於複雜的系統容易存在著安全性上的問題,且事後維護也
會相當不容易,另一

方面也可能會提高系統的開發成本。



●開發環境:

由於嵌入式系本身系統資源有限,因此並不會具有開發能力
,使用者必須透


過另一台機器進行程式開發,在燒錄於嵌入式設備上進行驗
証,如有問題必須在

回到另一台機器重覆進行開發編譯與燒錄的動作,因此嵌入
式必須建立一套完整

的開發工具與環境,提供軟體的開發除錯與測試。而一個優
秀的嵌入式開發環境

應該能夠提供一個完整的模擬工具,讓嵌入式軟體的開發不
必在依賴於硬體平台

開發的限制,使得嵌入式硬體與軟體可以同時進行開發動作
,軟體在硬體開發完

成前則可以利模擬器進行功能驗證與測試。




六:結論

如同在第一章所舉的衝浪人的例子,我們可以看到在高階的
嵌入式系統領域

中,可以說第一波領頭浪己經過去了(IPhone、IP
A、 Android等等..殺手級

的產品與全新應用概念),台灣雖然沒有幾家公司有跟上去
(因為台灣並非軟體

大國,第一波是以應用軟體為主),但隨著這一浪的主浪頭
過去後面的浪群至少

有 2~3波。但浪群中間的間隔總是很短暫的,如何在如此短
暫的時間內,趕快整


理好自己的浪板,調整好自己的置位,做好準備的動作,並
要抓緊對的時間點開

始加速衝刺(太早加速可能會後繼無力,太晚加速可能又會
追不上浪),這都是

在考驗著各個企業的應變能力與布局。但可以知道的是誰能
站在浪頭上,誰就能

享受居高臨下乘風破浪的那種快感。



本圖文內容為

Jarey版權所有,禁止任意轉載與拷貝動作,如有需要
請事先知會作者。

--Jarey 週報18期


2010年7月8日 星期四

Java 物件導向觀念 #2



※ 封裝

所謂物件導向程式,主要是由許多不同功能的物件組合而成,而其中的組合關係可能相當的錯綜復雜,若每個物件之間的變數都能夠直接任意的存取使用,很容易就會造成物件內部參數的錯亂,為了避免這類的情況發生,最好的方式就是將物件內的變數都封裝起來,並提供一個單一對外存取的窗口,任何物件要存取這個變數都必須透過這個窗口,而這個窗口就是利用函式(方法)來包裝變數,如此一樣便能讓程式運作更加的穩定與安全。事實上物件裡所包含的結構及方法,本身也是透過物件包裝起來,這也算是封裝特性的一種。所以我們可以利用封裝的特性將物件實作的方法與介面分開,防止物件本身的一些屬性被使用者無意間的修改。


◎ 類別成員(Class member)
在類別中可定義Field成員及方法(Method) 成員。

package com.ittraining.example;

public class Student {

private int classID; // 學號

protected int classID2;

private String name; // 名稱

private String schoolName;//學校

public void setClasssID(int classID) {

this.classID = classID;

}

public void setName(String name) {

this.name = name;

}

public int getClassID() {

return classID;

}

public String getName() {

return name;

}

public void setSchoolName(String schoolName){

this.schoolName=schoolName;

}

public String getSchoolName(){

return schoolName;

}

public void printData(){

System.out.println("姓名:"+name+"\n學號:"+classID+"\n學校:"+schoolName);

}

}



在Java 中,類別的存取權限修飾詞有"public"、"protected"、"private"、"default(無修飾詞)",當修飾詞或空時,預設將會以以套件 (package)為可存取範圍,也就是說只有在同一層package 中的class 才能進行存取。

上述的範例程式中程式中,我們定義了一個Student 類別,其中包含3 個被宣告為private的field 成員,分別是classID 、name與schoolName。由於宣告為private,所以代表這3 個成員只能在同一個Object 中進行存取,而無法被其他物件直接進行存取。

接著我們定義了6個Method 成員,全部都是宣告為"public",代表這些method 是公開的,可被其他物件所呼叫,method 的定義方式如下 :

存取修飾 傳回值型態 方法名稱(參數列) {
  return 傳回值;
}



也就是我們將classID 與name 成員變數透過private 宣告進行封裝,並另外再建立四個公開的方法讓其他物件透過我們公開的方法去對classID 與name 進行存取,而非直接將classID 與name 成員公開出去,一切的資料存取都需透過method 成員呼叫,而非直接呼叫該field 資料成員來進行存取。我們稱之為“資料的封裝",封裝的好處在於可以確保資料的安全性,與存取介面的一致性。



◎ 靜態成員(Static member)
對於每個物件來說,每個物件都各自擁有自己的資料成員。就算兩個物件是由同一個類別透過new 關鍵字產生,也不會發生更改了A Object 內的成員變數,連帶著B Object 也同時變動的情況。因為就在Object 被class loader 載入的那一刻,資料成員就以複本(Copy)的型態載另到記憶體之中。

然而在某些時候你會想要這些物件都可以共享相同的資料成員,此時就需要將刻資料成員宣告為static。一但資料成員被宣告為static 後,在同一個類別之中,該資料就只會存在一份,object 被class loader 載入時並不會再copy static 成員到記憶體中,而是共享的。舉個例來說,我們將前一個Student 的範例中進行些小修改,填加幾個預設學校名稱的參數,並宣告為static。


package com.ittraining.example;

public class Student {

private static String SCHOOL_ONE="建國中學";

private static String SCHOOL_TWO="北一女中";

private static String SCHOOL_THREE="景美女中";

private int classID; // 學號

private String name; // 名稱

private String schoolName="建國中學";//學校

public void setClasssID(int classID) {

this.classID = classID;

}

public void setName(String name) {

this.name = name;

}

public int getClassID() {

return classID;

}

public String getName() {

return name;

}

public void setSchoolName(String schoolName){

this.schoolName=schoolName;

}

public String getSchoolName(){

return schoolName;

}

public void printData(){

System.out.println("姓名:"+name+"\n學號:"+classID+"\n學校:"+schoolName);

}

public static void main(String args[]){

Student st1 =new Student();

st1.setClasssID(12345);

st1.setName("Kyle");

st1.setSchoolName(Student.SCHOOL_ONE);

     st1.printData();

}

}




由於static 成員是直接屬於類別,並不屬於任一個物件所獨有,因此可以直接以類別名稱去進行存取,而無需實體化成物件。例如:

st1.setSchoolName(Student.SCHOOL_ONE);


即有靜態資料,相對的我們也可以將方法宣告成靜態的方法(static method),而靜態方法通常是為了提供一些簡單的常數運算或一些操作上的小工具,例如我們可以於Student.java 中新增一個help 的靜態方法,該方法可說明此類別的功能與使用方式。


public static void help(){

System.out.println("請輸入姓名、學號與、所屬學校");

}



靜態方法的呼叫方式與靜態資料相同,皆是直接透過類別名稱+.運算子 + 方法名。其實我們時常用到System.out.println()本身就是一個靜態的資料+靜態方法的應用,這也就是為什麼我們不必去new System 物件就可以宜接使用out 這個靜物件,並可以直接呼叫println()這個靜態方法將字串貼於console 上。

由於static 成員是屬於類別而不是物件,因此若你要在static method 中呼叫非static 資料,在編譯時就會出現以下的錯誤訊息:

non-static variable xxx cannot be referenced from a static context

同樣的你也不能在static method 中呼叫非static 的method

non-static method xxxx() cannot be referenced from a static context

由於static 成員是屬於類別而不是物件,所以當您呼叫static 方法時,並不會傳入物件的位置參考,所以static方法中不會有 this 參考,由於沒有this 參考,所以在Java 的static 方法成員中不允許使用非static 成員,因為程式沒有this 來參考至物件位址,也就無法辨別要存取哪一個物件的成員,事實上,如果您在static 方法中使用非static 資料成員,在編譯時就會出現以下的錯誤訊息:
non-static variable test cannot be referenced from a static context

或者是在static 函式中呼叫非static 函式,在編譯時就會出現以下的錯誤訊息:
non-static method showMe() cannot be referenced from a static context

最後如果你希望在載入類別時就先進行一些初始化的動作,此時你可以使用static 區塊,將所有需要做初始化資源的成員全都放在static 區塊中。Static 區塊會在第一次呼叫而被載入時,static 區塊中的程式碼會先被執行,且只會執行一次。

public class Student {
....
static {
//
初始化程式碼
}
....
}