Microsoft PowerPoint - SE7ch01.ppt

Similar documents
Java 1 Java String Date

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

Learning Java

CC213

Microsoft Word _2 課本1225_OK_0222修.doc

(procedure-oriented)?? 2

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

Microsoft PowerPoint - 13_ClassAndObj.ppt

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378>

2 第 章 绪 论 Internet 2.0 使 得 消 费 型 电 子 产 品 用 户 可 以 通 过 多 种 不 同 的 数 据 网 络 访 问 互 联 网 内 容 用 户 可 以 使 用 便 携 式 消 费 型 电 子 设 备, 如 智 能 手 机 触 屏 平 板 电 脑 电 子 书, 甚 至

Microsoft Word - Mail2000_SecurityPatch_

软 件 工 程 专 业 习 指 南 目 录 一 软 件 工 程 专 业 设 置 背 景 与 发 展 前 景... 3 二 软 件 工 程 专 业 实 践 教 条 件... 4 三 软 件 工 程 专 业 课 程 类 型 及 核 方 式 软 件 工 程 专 业 课 程 类 型...7

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

附录J:Eclipse教程

<4D F736F F D2031A3AD4A617661BCBCCAF5CAC6CDB7D5FDBEA22E646F63>

計算機概論總複習完全攻略 9-1 程式語言簡介 程式語言的分類 1. 程式語言是人類與電腦溝通的工具 可用來命令電腦執行各項作業 2. 程式語言的分類 3. 低階語言 比較接近電腦硬體層次的語言 執行速度快 但不易編寫與閱讀 低階語言 機器語言 (1) 機器語言是唯一可以直接在電腦上執行的語言 由

摘 要 在 這 忙 碌 的 社 會 中, 普 遍 人 們 運 動 時 間 其 實 並 不 充 裕, 體 力 越 來 越 差 的 情 況 下 還 隨 意 飲 食 導 致 身 體 健 康 越 來 越 差, 因 此 本 專 題 打 算 利 用 健 康 飲 食 的 方 式 改 善 這 些 人 的 體 質,

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD




導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式


前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

子學習3 電子學習的定位 傳統電子學習 與 新世代電子學習 SAMS 台上講者從左至右 : 吳薇薇女士 羅陸慧英教授 佘孟先生 李芳樂教授 從 電子銀行服務 到 電子學習 題追3 專蹤電

Microsoft Word - 物件導向編程精要.doc

Chapter 3 Camera Raw Step negative clarity +25 ] P / Step 4 0 ( 下一頁 ) Camera Raw Chapter 3 089

Microsoft PowerPoint - P766Ch06.ppt

基于CDIO一体化理念的课程教学大纲设计

CH01.indd

投影片 1

本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操

FAQ -PowerDesigner9.5.DOC

Microsoft PowerPoint - chap2.ppt

Microsoft Word - compilation.docx

epub83-1

運算子多載 Operator Overloading

目次 

ActiveX Control

The golden pins of the PCI card can be oxidized after months or years

09 F9 128 peer to peer, P2P file transfer protocol bittorrent 10 P2P P2P GNU/ Linux P2P CC 單機版的智慧財產權 vs. 人權戰爭 1980 DVD content

1.1 1 () 擴展學習領域 () () 力求卓越創新 發皇通識教育 厚植職場發展的競爭能力 拓展國際交流 e 把握資訊網路的科技應用 () 精緻教育的學校特色 提升行政效率 發揮有效人力的整體力量 達成精緻大學的師資結構 勵應用科技的研發能力 在策略執行上

人為疏失 人與人之間的溝通合作, 往往是事故的最終防線, 若能發揮團隊合作的功能, 則比較能克服其他因素所造成的危害

Microsoft PowerPoint - programming-languages.ppt

1 IT IT IT IT Virtual Machine, VM VM VM VM Operating Systems, OS IT

Microsoft Word - 13院21号.doc

! 2000 CSSsprites.com Web FTP app 20% 80% getelementbyid() UI Facebook F8 Web CSSsprites.com Web JavaScript CSS React xi React UI UI 反應 UI 宣告 d

Microsoft PowerPoint - plan08.ppt

Microsoft Word _Java_術科 .doc

学 院 人 才 培 养 分 项 自 评 报 告 结 果 汇 总 表 主 要 评 估 指 标 关 键 评 估 要 素 自 评 等 级 1.1 学 校 事 业 发 展 规 划 合 格 1. 领 导 作 用 1.2 办 学 目 标 与 定 位 合 格 1.3 对 人 才 培 养 重 视 程 度 合 格 1

untitled

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

ebook

VB程序设计教程

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

桌上型個人電腦採購規格說明表


輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

Wire Wound Ceramic Chip Inductor 繞線式陶瓷晶片大电流電感 HPWS Series for High Frequency HPWS 系列適用於高頻 INTRODUCTION 產品介紹 The HPWS is the chip inductors of a wire w

Microsoft PowerPoint - 3C¬ì§Þ»P¥Í¬¡-chapter2

untitled

目錄

2016 勒索軟體白皮書

桌上型個人電腦採購規格說明表

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas

Microsoft Word - LP doc

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

<4D F736F F D20A7EBBCD0B6B7AABEAAFEA5F3322D3935A67EB2C432A6B8B2C433B2D5C5E3A5DCA564B357BD64AED12E646F63>

1

Microsoft Word - CPE會議紀錄151022

附 件 : 2009 年 度 国 家 精 品 课 程 名 单 一 本 科 国 家 精 品 课 程 ( 以 学 科 为 序, 共 400 门 ) 序 号 一 级 学 科 二 级 学 科 课 程 名 称 学 校 名 称 负 责 人 1 哲 学 哲 学 类 马 克 思 主 义 伦 理 学 安 徽 师 范

Microsoft PowerPoint - chap01.ppt

高 职 计 算 机 类 优 秀 教 材 书 目 * 序 号 书 号 (ISBN) 书 名 作 者 定 价 出 版 / 印 刷 日 期 ** 配 套 资 源 页 码 计 算 机 基 础 课 计 算 机 应 用 基 础 刘 升 贵 年 8 月

Microsoft PowerPoint - Chap03.ppt [相容模式]

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

二次曲線 人們對於曲線的使用及欣賞 比曲線被視為一種數學題材來探討要早 得多 各種曲線中 在日常生活常接觸的 當然比較容易引起人們的興趣 比如 投擲籃球的路徑是拋物線 盤子的形狀有圓形或橢圓形 雙曲線 是較不常見的 然而根據科學家的研究 彗星的運行軌道是雙曲線的一部 分 我們將拋物線 圓與橢圓 雙曲

APA Preliminaries Text Reference 1. Cover Page 2. Title Page 3. Signature Page 4. Advisor s recommendation letter 5. Approval page 6. Copyri

電腦設備LP _第七組顯示卡規範書

17-72c-1

x 前言 Python Python ETL extract transform load Python Python / Python Python Python

2017政府共同供應契約採購指南V3.xls

PICkit2 燒寫器編程器調試器

多層次傳銷與獎金系統

投影片 1

全 国 高 等 职 业 教 育 规 划 教 材 21 世 纪 高 职 高 专 规 划 教 材 系 列 高 等 职 业 教 育 计 算 机 专 业 规 划 教 材 选 题 征 集 通 知 一 选 题 范 围 ( 不 仅 限 于 此 ) 选 题 方 向 选 题 名 计 算 机 基 础 计 算 机 应 用

创业板投资风险提示:本次股票发行后拟在创业板市场上市,该市场具有较高的投资风险

untitled

chp1

Microsoft Word - 全華Ch4Ans.doc

Transcription:

第一章 Java 簡介 課前指引在本章中, 我們將針對 Java 語言的定位與特色做一些說明, 並且示範如何編譯與執行 Java 程式, 以配合往後章節的範例練習 章節大綱 1.1 電腦系統 1.2 電腦軟體 1.3 程式語言 1.4 程式語言簡介 1.5 Java 與物件導向 1.6 編譯與執行範例 1.7 本章回顧 備註 : 可依進度點選小節

1.1 電腦系統 電腦硬體就是您可以看到的電腦設備 ( 拆開外殼 ), 不過若光是這樣形容電腦硬體未免過於簡單 實際上, 若從功能面加以區分, 可將電腦硬體分為 5 大單元 ( 如下圖 ),5 個單元分別負責不同的工作 註 : 算術邏輯單元與控制單元合稱中央處理單元 ( 就是常聽到的 CPU) 中央處理單元和主記憶體則為電腦的核心部分, 其餘的周邊設備 ( 輸入單元與輸出單元 ) 必須與之連結, 透過中央處理單元的控制, 使周邊設備正常運作 3 1.2 電腦軟體 電腦軟體分為資料與程式兩大類, 事實上不論是哪一類, 都是以 0 1 的二位元表示法儲存在電腦設備中 ( 例如 : 儲存於硬碟機中 ) 而程式又可以分為系統程式 (System Program) 與應用程式 (Application Program) 4

1.2 電腦軟體 系統程式一般為較接近硬體底層的低階程式 例如 : 作業系統 (Operating System) 編譯程式 (Compiler) 組譯程式 (Assembler), 連結程式 (Linker) 等都屬於系統程式 應用程式則是架構在系統程式之上, 依據某種特殊需求而開發出來的軟體 例如 :Office 帳務系統 電腦遊戲等等 5 1.2 電腦軟體 延伸學習 : 韌體 韌體是存放於特殊硬體中而極少或永不變動的特殊程式, 例如 BIOS 6

1.3 程式語言 語言的用途是做為人與人溝通的橋樑, 例如 : 和美國人交談就要用英文溝通 同樣地, 人若要和電腦溝通的話, 就必須使用電腦 懂 的語言, 這種語言稱為程式語言 (Programming Language) 而一般我們用來與人溝通的語言則稱為自然語言 (Natural Language) 7 1.3 程式語言 程式語言依據與自然語言的相似度又可以分為 3 種 : 機器語言 低階語言及高階語言 其中高階語言與人類所使用的自然語言最為相近, 而機器語言則和人類所使用的語言南轅北轍 8

1.3 程式語言 程式語言分類圖 9 1.3.1 機器語言 機器語言 (Machine Language) 是電腦硬體唯一能辨識 能解讀的語言 機器語言就是一連串的 0 1 二進位數字組合, 因此又稱為機器碼 一般人通常看不懂這些 0 1 所代表的特殊涵義, 其實對於電腦而言, 這些 0 1 的組合數字, 可能代表某種資料, 也可能代表某個指令由於大多數的人無法了解或記憶這一連串 0 1 數字所代表的涵義, 因而發展了低階語言與高階語言 註 : 資料或程式確實是用二進位表示, 但有的時候為了縮短這一連串的二進位數字表示, 某些書籍或軟體會將機器語言使用 16 進制來加以表達 例如 : 01001001 49H 10

1.3.2 低階語言 低階語言 (Low-level Language) 是一種接近機器語言的表示方法, 不過卻使用人類比較容易記憶的單字形式來對應一連串的 0 1 組合 最典型的低階語言就是組合語言 (Assembly Language) 在組合語言中, 使用運算子與運算元來表示一連串的 0 1 組合, 而這些運算子則使用類似英文的縮寫以利人類的記憶與理解, 故稱為助憶碼 例如 : 使用 INC 來代表 Increment( 累加指令 ) 8051 機器語言指令 8051 組合語言指令 意義 00000100 INC 執行累加 1 10000100 DIV 執行除法 8051 組合語言指令與機器語言指令的對應 11 1.3.2 低階語言 在上表中, 很明顯的可以看出, 組合語言的指令與機器語言的指令是一對一的對應關係, 但是卻比機器語言容易記憶, 除此之外, 其他關於組合語言的設計都與機器語言的設計相同, 我們可以從下表中更明確地看出兩者的相同與相異處 : x86 機器語言 x86 組合語言 意義 0000001111001000 ADD CX,AX 執行暫存器加法 101110010011010000010010 MOV CX,1234H 將 CX 暫存器的值指定為 1234H x86 組合語言與機器語言的對應 12

1.3.2 低階語言 由上述的兩個表格中, 我們可以得知幾件事 : (1) 組合語言比機器語言更接近人類所使用的自然語言 (2) 不同的 CPU 所使用的組合語言也不相同 (3) 任何一個完整的組合語言指令恰好對應一組機器語言的 0 1 串列 13 1.3.2 低階語言 組合語言與機器語言一對一的特性, 使得組合語言可以完全掌控電腦的硬體結構 在執行效率上自然也就完全交由程式設計師決定 不過, 由於不同的 CPU 必須使用不同的組合語言並且必須對於該 CPU 的組織結構有充分認知因此, 這種低階語言仍舊無法被絕大多數的人所接受, 因而發展了更接近於人類自然語言的高階語言 註 : 組譯程式 (Assembler; 又稱組譯器 ) 是一種用來將組合語言轉換為機器語言的一套程式, 相較於其他的系統程式而言, 組譯程式屬於一種比較容易開發的系統程式 14

1.3.3 高階語言 高階語言 (High-level Language) 組合語言雖然比機器語言更接近於自然語言, 但組合語言的程式設計師必須對於執行程式的處理器有更多的了解, 並且各類處理器的組合語言並不相同, 因此, 一種比組合語言更接近自然語言且不因更換機器而改變語法的程式語言也被發展出來, 此種語言就是高階語言 高階語言的出現, 使得程式設計師可使用更接近人類思維的方式來設計程式 當程式設計完成之後, 必須先通過翻譯程式的翻譯, 才能夠被電腦執行 高階語言的運算子通常具有比較強大的功能, 單一行的高階語言程式可能被翻譯成許多的機器碼, 因此可完成較為複雜的工作 15 1.3.3 高階語言 翻譯高階語言的系統程式有兩種, 分別是編譯器 (compiler) 與直譯器 (interpreter) 兩者在處理與執行程式的方法上有顯著的不同 : 編譯器編譯器採用整批作業 (Batch) 方式來處理程式翻譯的工作, 換句話說, 當我們將程式設計完畢並交由編譯器翻譯之後, 編譯器會將之先轉換為中間碼, 再將中間碼翻譯為目的碼並存入目的檔 (object file) 中, 而這個目的檔再經由連結其他目的檔及程式庫之後, 會形成可執行檔 (execute file), 然後才能在電腦上直接執行 使用編譯器翻譯的程式語言有 C C++( 編譯器為 gcc g++ VC++ BCB) Pascal Object Pascal( 編譯器為 Delphi Kylix) 等等 16

1.3.3 高階語言 一個使用編譯器翻譯的程式處理流程如下圖 圖 1-5 採用編譯器翻譯的程式處理流程 17 1.3.3 高階語言 編譯器 這類語言允許 ( 或要求 ) 程式設計者使用模組化技巧來設計程式, 也就是把某些具有特殊功能的片段程式獨立成一個個的函式, 並將之集合成一個函式庫檔案, 如此一來, 就可以讓需要使用該功能的程式透過連結的方式加以結合, 縮短撰寫程式的時程 例如 : math 函式庫中就包含許多求三角函數值的函式, 所以程式設計者並不需要自行撰寫求三角函數值的詳細步驟, 只要在需要求三角函數值時, 引用 math 函式庫即可 18

1.3.3 高階語言 編譯器 在圖 1-5 中, 我們可以發現到, 使用編譯器翻譯程式, 若原始程式中有些錯誤, 則必須重新回到編輯器修改原始程式, 並重新執行圖 1-5 的整個流程, 所以在開發除錯的階段有些許不方便 不過, 近年來由於整合式開發環境 (Integrated Development Environment; 簡稱 IDE) 的發展, 讓使用編譯器開發程式時, 也同樣具有監督程式逐行執行的能力, 改善了開發除錯的困難 19 1.3.3 高階語言 直譯器 直譯器與編譯器處理程式的最後步驟不同, 它同樣會將原始程式翻譯為中間碼, 但並不產生目的檔或可執行檔 直譯器會逐行翻譯中間碼並送交電腦執行, 因此, 每一次要執行程式時, 都必須啟動直譯器來重新翻譯程式 也正因為如此, 當程式中有錯誤發生時, 前面正確程式碼對應的中間碼仍會被執行, 並且停留在錯誤的那一行程式, 換句話說, 直譯器具有監督執行狀況的效果, 因為可觀察程式執行過程, 故較適合用於程式開發過程 常見的 JavaScript VBScript Python 等都是採用直譯器翻譯的程式語言 圖 1-6 採用直譯器翻譯的程式處理流程 20

1.3.3 高階語言 由於高階語言是透過編譯器或直譯器的處理後, 才執行程式, 因此高階語言通常具有較高的硬體獨立性 (machine independent), 也就是具有可攜性 (portable) 換句話說, 程式設計師在 A 機器上所撰寫的高階語言程式, 如果想要拿到 B 機器上執行時, 通常不需要修改程式 ( 或只需要小幅度的修改 ), 因為程式設計師只需要更換另外一套在 B 機器上執行的編譯器或直譯器, 就可以將程式重新翻譯並在 B 機器上順利執行 也就是說, 高階語言的語法統一, 而不像組合語言般必須考量到執行平台的因素 21 1.4 程式語言簡介 Java 是一個高階語言, 也是一個物件導向程式語言 (Object-Oriented Programming Language; 簡稱 OOPL) 在介紹什麼是物件導向程式語言之前, 我們必須先對高階語言的分類與發展歷程有所了解 22

1.4 程式語言簡介 命令式型態程式語言 (Imperative Paradigm Programming Language) 程式語言從型態上來區分, 可以分為 1. 命令式型態 2. 函數式型態及 3. 邏輯式型態等等 其中函數式與邏輯式型態的代表分別為 LISP 與 Prolog, 兩者大多使用在人工智慧方面 而其他常見的程式語言, 例如 C/C++ BASIC Pascal FORTRAN COBOL Java 等都屬於命令式型態 23 1.4 程式語言簡介 命令式型態程式語言 (Imperative Paradigm Programming Language) 命令式型態的程式語言主要是透過一連串指定敘述 (assign statement) 組合而成, 這些指定敘述又稱為表示式 (expression), 只要依序執行這些指定敘述就可以得到結果 x = x+1; 上述是一個 Java 語言表示式, 說明了 Java 語言屬於命令式型 態的程式語言 上述運算式, 若以數學式子來表示, 則為 x t+1 = x t + 1, 其 中 t 代表時間 24

1.4 程式語言簡介 命令式型態程式語言 (Imperative Paradigm Programming Language) 命令式型態的語言通常提供了幾種基本的控制流程結構, 包含循序流程結構 選擇流程結構 迴圈流程結構 無條件跳躍等等 除了無條件跳躍之外,, 我們將在本書的第四章介紹 Java 所支援的幾種流程控制 25 1.4 程式語言簡介 結構化程式語言 (Structural Programming Language) 命令式型態的程式語言在撰寫時, 為了要將程式的再利用率提高以利於維護, 因此發展成結構化程式語言例如 C 語言就是結構化程式語言 26

1.4 程式語言簡介 結構化程式語言 (Structural Programming Language) 結構化程式語言採用結構化分析設計的方法, 將問題由上向下, 由大到小切割成許多子問題, 分別尋得子問題的解答, 最後再結合起來解決所要解決的問題 這種方法, 也可以稱為模組化設計 解決子問題的方法被分成一個個的模組, 這些模組在某些語言 ( 例如 C 語言 ) 中被稱為函式 除此之外, 一個結構化的程式語言還有另一項重要的特性, 也就是使用 for while 等條件式迴圈來取代 goto 無條件跳躍指令這有利於日後的程式維護 27 1.4 程式語言簡介 物件導向程式語言 (Object-Oriented Programming Language; 簡稱 OOPL) 結構化程式語言佔據程式開發市場約有十多年之譜, 隨著時代演進, 使用者對軟體功能的要求也越來越多, 而結構化程式設計卻在發展大型軟體時遭遇到許多問題 28

1.4 程式語言簡介 物件導向程式語言 (Object-Oriented Programming Language; 簡稱 OOPL) 結構化程式設計將問題切割成許多小問題 ( 模組 ), 由於這些模組的存在目的是為了解決大問題而設計的, 因此, 這些模組有可能存取同一個資料結構, 這將導致模組之間的獨立性質降低例如, 某兩個模組可能都會修改陣列資料結構中的元素, 因此當我們希望將某一個模組的操控對象從 陣列 改為 鏈結串列 時, 另外一個模組也必須跟著改變 因此, 結構化程式設計雖然對於某些問題可以快速尋得解決方案, 但對於日後的維護則顯得不足, 故後來又發展了以物件導向為基礎的程式語言 29 1.4 程式語言簡介 物件導向程式語言 (Object-Oriented Programming Language; 簡稱 OOPL) 物件導向程式設計以物件為出發點, 藉由物件與物件之間的互動完成問題的解答, 比較符合真實世界環境 由於每一個物件都是一個獨立的個體, 因此更動某一物件的內容時, 其他的物件並不需要跟隨著變動 如此一來, 在尋求大型或超大型方案的解答時, 不但比結構化程式設計容易分析問題, 更有助於日後的維護與修改 30

1.4 程式語言簡介 物件導向程式語言 (Object-Oriented Programming Language; 簡稱 OOPL) 為了發展以物件導向為基礎的程式設計方式, 因此, 眾多物件導向程式語言隨之誕生物件導向型態的程式語言最早起源於 Kristen Nygaard 與 Ole-Johan Dahly 在 1961~1967 年所發展的 Simula I 和 Simula 67 爾後則有 SmallTalk C++ Object Pascal Java Visual Basic.NET C# 等等語言都屬於物件導向程式語言 其中有些屬於純物件導向 ( 例如 Java Smalltalk) 有些則包容了傳統結構化程式設計方式 ( 例如 C++ 包含了 C 的設計方式 ) 31 1.5 Java 與物件導向 Java 是一種純物件導向程式的程式語言, 在本節中, 我們將介紹物件導向的特性以及 Java 的發展歷史 32

1.5.1 物件導向程式設計 物件導向程式設計 (Object-Oriented Programming; 簡稱 OOP) 是一種以物件觀念來設計程式的方法 在純物件導向的程式中, 每一個運作實體都可視為某種類別衍生出來的物件而類別則較具抽象的概念, 也就是某些具有共同特性物件的集合換句話說, 物件就是類別的實體 每個物件都擁有某些特性 (attribute) 與行為 (behavior), 在物件導向程式設計中則稱之屬性 (property) 與方法 (method) 33 1.5.1 物件導向程式設計 物件導向程式設計 物件導向具有封裝 繼承 多型等特性, 原則上每個物件相互獨立且無關聯性, 而物件導向程式設計就是依照物件的方法產生互動以完成要求 而物件之間的互動是透過訊息 (Message) 的傳遞來達成, 發送訊息的物件稱之為發送者 (sender), 接受訊息的物件稱之為接收者 (receiver), 當物件需要其他物件服務時, 會發送訊息給接收者, 接收者在收到訊息後, 會執行符合要求的方法完成任務以提供服務 34

1.5.1 物件導向程式設計 物件 (Object) 真實世界中的所有具體或抽象的事物, 都可以將之視為一個 物件 例如 : 您可以把一架飛機想像成是一個物件 (Object) 而飛機的零件 ( 例如 : 座椅 引擎 操縱桿 ) 則是較小的物件明顯地, 這些物件仍舊可以再細分為更小的物件 ( 例如 : 螺絲釘 ) Java 為物件導向程式語言 (OOPL) Java 的物件是一些程式碼和資料的組合, 物件必須能夠單獨成為一個完整單元, 也可以組合成更大的物件 例如 : 一個按鈕或一個表單都是一個物件 而一個應用程式最大的物件就是應用程式的本身 35 1.5.1 物件導向程式設計 屬性 (Property) 物件擁有許多特性 (attribute), 這些特性代表了一個物件的外觀或某些性質例如 : 民航機物件的最高速度就代表了該飛機的一種特性 民航機物件的重量 載重量 等等也都可以用來代表飛機的某些特性 這些特性在物件導向程式設計中稱之為屬性 (Property) 事實上, 有的時候在取得物件的某些屬性時, 所得到的也可能是另一個 ( 子 ) 物件 ( 若該屬性的資料型態是一個類別 ) 例如 : 民航機的引擎也是一個物件, 因為它可以由更多更小的零件來組成, 同時引擎物件也存在自己的方法 (Method), 例如 : 引擎點火 36

1.5.1 物件導向程式設計 屬性 (Property) 在程式設計或執行階段, 我們可以藉由改變屬性值來改變整個物件的某些特性, 完成我們想要的物件表示形式 例如 : 將民航機物件的機殼漆成藍色, 將按鈕背景顏色設為黃色 在 Java 語言中, 屬性 (Property) 被稱為欄位, 並被區分為不同的保護等級 某些等級的欄位並不允許外部程式加以修改, 而必須透過該物件的方法, 才能夠修改這些欄位, 因此具備保護資料的功能 37 1.5.1 物件導向程式設計 方法 (Method) 每個物件都擁有不同數量的行為, 這些行為在物件導向程式設計中稱之為方法 (Method) 不同種類的物件所擁有的方法大多不同, 但同類物件擁有的方法則大致相同 所謂方法, 也就是為了完成該物件某些目標的處理方式 例如 : 飛機類別的物件有許多方法使得飛機變得有些用途, 這些方法如起飛 降落 逃生等等 每個方法都有許多的細節, 例如起飛, 可能包含 發動引擎 直到拉動操縱桿, 這些就是起飛方法的細節 38

1.5.1 物件導向程式設計 方法 (Method) 在本書中, 我們也將方法稱之為函式 ( 但會隸屬於特定的類別 ) 這是為了 C/C++ 語言愛好者學習 Java 之便 同時 Java 的方法也和欄位一樣, 被區分為多種等級 某些等級的方法同樣不允許外部程式呼叫執行 ( 只能做為內部方法呼叫執行的對象 ), 因此達到封裝物件的功能 39 1.5.1 物件導向程式設計 方法 (Method) 對於某些由他人完成的物件而言, 該物件同樣必須提供許多關於物件的方法 如此一來, 我們就不需要了解這些方法的細節, 而能夠快速運用物件來完成工作 例如飛機物件提供了起飛方法, 我們只要指定執行起飛方法, 而不需要了解起飛過程的種種細節, 飛機就會起飛 40

1.5.1 物件導向程式設計 註 某些物件導向程式語言的屬性與本處所提之屬性有些不同, 這裡所提的屬性相當於 Java 和 VB.NET 的欄位, 而 VB.NET 的屬性則為方法與欄位的綜合體, 亦即使用特性名稱的方法 ( 如 Set Get) 存取特定的欄位 圖 1-7 類別與物件件 41 1.5.1 物件導向程式設計 類別 (Class) 不同的物件可以擁有相同的屬性及方法, 例如 : 一架民航機 和 一架戰鬥機 各是一個物件, 但兩者的速度 爬升力 重量 載重量雖不相同, 但卻同樣擁有這些屬性以便表達完整物件的各個特性 所以, 不同的物件若擁有共同的屬性, 但因為屬性內容的不同, 因此可以創造出同類性質但卻獨立的不同物件 而同類型的物件, 則構成了類別 (Class) 例如每一個按鈕都是一個物件, 屬於按鈕類別之下所建造出來的物件實體, 但是由於按鈕的名稱不同, 因此視為不同且獨立的物件 42

1.5.1 物件導向程式設計 類別 (Class) 更明確地說, 類別才是物件導向程式設計最基本的單元 以上例來說, 民航機 和 戰鬥機 都是物件, 而 飛行器 或 飛機 才是類別 不同的只是在建立該類別的實體物件時, 給予不同的屬性而已 事實上, 在實際的物件導向程式設計中, 我們必須先定義類別, 然後才能夠透過類別宣告各個屬於該類別下的物件 43 1.5.1 物件導向程式設計 類別 (Class) 在純物件導向的程式中, 程式碼是以類別為基礎, 物件只是類別的實體 就如同汽車是一個類別, 它是一個抽象的名詞 ; 而車牌號碼為 010 015 等的車輛是汽車類別的兩個物件, 實際運作時通常依靠的是物件 我們將於下一小節中, 更深入介紹物件導向程式語言的特性 44

1.5.1 物件導向程式設計 圖 1-8 類別生成物件 45 1.5.2 物件導向程式設計的特點 物件導向程式設計具有某些特點如下, 使得它更適合用以開發 管理大型程式 封裝性 (encapsulation): 封裝性可以將物件區分為可被外界使用的特性及受保護的內部特性換句話說, 除非是允許外部程式存取的資料, 否則外部程式無法改變物件內的資料 如此就能夠達到封裝保護資料的特性 46

1.5.2 物件導向程式設計的特點 更細分來說, 物件導向程式設計將物件的資料與方法 至少 區分為三種等級 : public : 公用等級 private : 私用等級 protected : 保護等級其中私用 (private) 等級的資料與方法, 只允許相同類別內的程式碼取用而保護 (protected) 等級的資料與方法, 只允許相同類別及衍生類別 ( 何謂衍生類別後述 ) 的程式碼取用至於公用 (public) 等級的資料與方法, 則開放給任何程式碼取用 ( 註 :Java 的封裝等級還需要考量到 package 的影響, 留待第 11 章說明 ) 47 1.5.2 物件導向程式設計的特點 圖 1-9 封裝性 48

1.5.2 物件導向程式設計的特點 機房物件 公開屬性 : 原料 成品私有屬性 : 水 公開方法 : 使用純水 使用礦泉水 方形餅乾製作 星形餅乾製作 圓形餅乾製作私有方法 : 機器 A 啟動 機器 B 啟動 機器 A 快轉 以圖 1-9 為例 講究衛生的食品餅乾工廠, 其內部機房就具有封裝特性 對外, 它只開放原料與成品兩個可存取的屬性, 並且提供製作方形餅乾 製作星形餅乾 製作圓形餅乾等操作方法的按鈕 原料屬性對外是可存取的, 例如您可能放入的是三號麵粉, 但也可以改為二號麵粉 成品也是可以存取的, 例如您可以把餅乾吃掉 裝箱或捏碎報廢 49 1.5.2 物件導向程式設計的特點 被封裝的屬性則是不可存取的, 除非透過外部方法間接存取例如製作過程中需要水, 而我們無法直接變動水的種類, 必須透過對外的公開方法 ( 也就是純水或礦泉水按鈕 ) 來完成換句話說, 在這個範例中, 我們無法隨意將水變更為海洋深層水, 因為我們無法直接進入到機房內部 同理, 由於我們無法進入機房內部直接操作機器, 所以只能透過對外操作面板上的三個按鈕選擇要執行的製作程序 當我們按下某一個按鈕時, 相當於呼叫機房物件的一個公開方法, 此方法的細節則可以動用到機房內的所有資源 可是機房的設計一但完成後, 這些方法的細節也就固定了對於使用機房物件的使用者而言, 他只能選擇執行某一個按鈕方法, 而無法更動按鈕方法的執行內容細節 50

1.5.2 物件導向程式設計的特點 更進一步來說, 假設我們是設計機房物件的程式設計師, 這代表著我們可以進入機房, 也可以設計各種餅乾的製作細節但即使進入了機房, 當我們面對每一台機器時, 由於每一台機器也都是一個物件 ( 同樣也具有封裝性 ), 故我們只能操作機器對外的按鈕, 而無法進入機器的內部 因此, 封裝性使得問題變為分層負責的狀態, 更符合生活上的作事原則 設計物件者有責任將物件設計的完整且不會出錯, 也需要留下一些對外可操作的方法, 必須時也可留下一些外部可存取的屬性 而使用物件者, 則只能夠透過物件對外的屬性與方法來利用物件達到自己的需求 51 1.5.2 物件導向程式設計的特點 小試身手 1 1 電子鬧鐘 物件具有封裝性, 試以電子鬧鐘為例, 說明電子鬧鐘的哪一些屬性為公開屬性? 哪一些為私有屬性? 哪一些為公開方法? 哪一些為私有方法? 52

1.5.2 物件導向程式設計的特點 繼承性 (inheritance): 為了達成重覆使用的目的所採取的一種策略 例如 : 一個滑鼠類別只要加上滾輪裝置, 就變成了滾輪滑鼠, 但滾輪滑鼠也同樣可以上下左右移動改變指標位置, 也可以按兩下執行程式, 只不過現在又多了一個滾輪使得瀏覽網頁時更加方便, 因此, 這個滾輪滑鼠類別可繼承滑鼠類別再加以擴充 在物件導向程式設計中, 允許使用者定義基底類別 (base class) 與衍生類別 (derived class), 其中衍生類別允許繼承基底類別的屬性及方法, 並 加入新的屬性及方法 或者改寫(override) 某些繼承的方法, 改成適用於本身的方法 有了這項特性, 在開發大型程式時, 我們就可以延續已經完成的技術, 再加擴充 53 1.5.2 物件導向程式設計的特點 圖 1-10 繼承性 54

1.5.2 物件導向程式設計的特點 多型性 (polymophism): 就多型性而言, 其實它是一個非常抽象的名詞, 代表著一種彈性 舉例來說, 所謂開水人人會煮, 各有巧妙不同, 基本上, 瓦斯爐 電磁爐 熱水瓶都可以煮開水, 所以 煮開水 其實是一個相當抽象的名詞使用瓦斯爐 電磁爐 熱水瓶的煮開水方式都不一樣, 但 煮開水 一詞卻涵蓋了這些差異性的行為, 而此種特質則稱為 多型性 55 1.5.2 物件導向程式設計的特點 多型的實作方法有很多種, 其中一種是改寫 ( override; 或稱覆寫 ), 它與繼承有關例如瓦斯爐衍生類別 電磁爐衍生類別 熱水瓶衍生類別都繼承自加熱器基底類別, 該基底類別中定義了加熱的方法, 我們則必須在衍生類別內, 改寫這個方法, 使得加熱的細節有所不同 如此一來, 由不同衍生類別所產生的物件, 執行方法時的細節就會不同了 換句話說, 使用物件者不知道物件是如何處理加熱的, 但瓦斯爐的實體物件 電磁爐的實體物件 熱水瓶的實體物件知道自己是如何進行加熱的 56

1.5.2 物件導向程式設計的特點 改寫 (override) 不改寫 57 1.5.3 Java 簡介 Java 是 1991 年, 由 Sun 公司的 James Gosling 根據 C++ 的物件導向理念而發展的另一種物件導向語言 其基本語法與 C++ 的語法十分相似, 但 Java 是一個更純正的物件導向程式語言, 擁有物件導向程式語言所有的特性 ( 封裝 encapsulation 繼承 inheritance 多型 polymorphism) Java 原本的名字是 Oak, 原本是計畫用在消費性電子產品 ( 例如冷氣 微波爐等 ) 的跨平台整合, 但在 1993 年, 網際網路蓬勃發展的時代被大量使用, 而於 1994 年時重新命名為 Java, 並在 1995 年由 Sun 正式發表 58

1.5.3 Java 簡介 Java 大事記 年代 大事 1991 Green 計畫, 由 James Gosling 領導執行, 推出 Java 的前身 Oak 1995 Sun 正式命名為 Java, 並推出 Java 1.0 Netscape 決定將 Java 加入 Netscape 2.0 瀏覽器中 1996 JDK(Java Development Toolkit) 1.0 版公佈 Netscape 公佈 Java-enable Netscape 2.0 瀏覽器 1997 JDK 1.1 版公佈 1998 JDK 1.2 版公佈, 並更名為 Java2 1998 Java2 企業平台 J2EE 發布 1999 Sun 發布 Java 的三個版本 : 標準版 (J2SE) 企業版(J2EE) 和微型版 (J2ME) 59 1.5.3 Java 簡介 Java 大事記 ( 續 ) 年代 大事 2000 JDK1.3 公佈 表 1-3 Java 大事紀 2000 JDK1.4 公佈 2001 J2EE1.3 公佈 2002 J2SE1.4 公佈 2004 J2SE1.5 公佈 (JDK1.5) 2005 由於 Java2 已經問世一段時間, 因此 Sun 也取消了中間的 2, 故自此之後,J2EE 更名為 Java EE,J2SE 更名為 Java SE,J2ME 更名為 Java ME, 所以 J2SE 1.5 稱為 Java SE 5.0 版 (JDK 1.5 更名為 JDK5) 2006 Java SE 6.0 版公佈 ( 即 JDK6; 也就是 JDK 1.6 版 ) 2009 Sun 被 Oracle 收購 2011 7 月 7 號,Java SE 7.0 版公佈 ( 即 JDK7; 也就是 JDK 1.7 版 ) 60

1.5.3 Java 簡介 由表 1-3 的大事紀中, 我們可以得知 Java SE7.0 版指的是 JDK7 而什麼又是 JDK 呢? JDK 的全文是 Java Development Toolkit, 顧名思義, 這是一套 Java 的發展工具套件我們將在下一小節中再重新介紹它 61 1.5.4 JDK 與 JVM 簡介 介紹 JDK 之前, 首先我們必須釐清 Java 究竟是使用編譯器還是直譯器來翻譯程式? 這個問題的答案其實是 一半一半 傳統編譯器的處理流程如圖 1-12, 編譯器會將原始程式經過語法和語意的分析後, 將之轉為中間碼 (intermediate representation; 簡稱 IR), 而中間碼的格式與組合語言已經非常接近 後面的步驟則在進行最佳化以及產生目的碼 在產生中間碼之前的步驟都是屬於與機器無關 (machine independent) 的處理程序, 這也使得高階語言具有可攜性 62

1.5.4 JDK 與 JVM 簡介 圖 1-12 傳統編譯器的處理流程 63 1.5.4 JDK 與 JVM 簡介 常見的中間碼有幾種表達方式 包含後置式 (postfix notation) 三位址碼(3- address code) P-code 語法樹等等 其中的 P-code 是一種可以在虛擬堆疊機器 (Virtual Stack Machine;VSM) 上所執行的程式碼 至於直譯器的處理程序則如圖 1-6 所示 它會讀入原始程式, 一行一行的解釋並執行, 所以速度比較慢 64

1.5.4 JDK 與 JVM 簡介 Java 語言和其他傳統高階語言的處理程序都不相同 它為了要達到絕對的跨平台, 採用了編譯與直譯混合的模式 也就是取出編譯器中與機器無關 (machine independent) 的處理程序, 而後半段則交由 JVM 直譯器來執行 因此,Java 程式會經過編譯器 (compiler) 編譯為位元組碼 (Bytecode), 而 "Bytecode" 可以由 Java Virtual Machine( 簡稱 Java VM 或 JVM) 來執行 65 1.5.4 JDK 與 JVM 簡介 註 Bytecode 相當於編譯器之中間碼的 P-code JVM 是一個直譯器 (interpreter; 有些書籍翻譯為解釋器 ) 圖 1-13 Java 程式的開發與執行 66

1.5.4 JDK 與 JVM 簡介 Oracle 提供了各平台所需的 JVM, 用來直譯 "Bytecode",( 如下圖 ) 因此,Java 做到了絕對的跨平台 圖 1-14 Java 能夠達到完全的跨平台 67 1.5.4 JDK 與 JVM 簡介 由圖 1-13 中, 我們可以得知, 要使用 Java 撰寫並執行程式, 必須擁有編輯器 Java 編譯器 JVM 等三種軟體 現今所有的作業系統都提供了一些基本的編輯器, 例如 Unix/Linux 的 Vim Windows 的記事本 而 Java 編譯器與 JVM 則需要由 Oracle 來提供, 我們可以至下列網站下載相關軟體 http://www.oracle.com/technetwork/java/javase/downloads /index.html 68

1.5.4 JDK 與 JVM 簡介 下載 圖 1-15 http://www.oracle.com/ 網站 69 1.5.4 JDK 與 JVM 簡介 在上述網站的左側, 我們可以發現 Java 有三種套餐可供選擇, 其特色如下 : Java SE:Java Standard Edition 的縮寫, 也就是標準版, 它提供了開發一般程式的套件與平台 本書所使用的軟體版本為 Java SE 7.0 版 Java EE:Java Enterprise Edition 的縮寫, 也就是企業版, 提供企業伺服器級的套件與平台, 例如發展 JSP 動態網頁就需要使用這個版本 通常 Java EE 版本更新的速度會晚於 Java SE Java ME:Java Micro Edition 的縮寫, 也就是微型版, 提供微型設備的開發套件與平台, 在這個項目中,Oracle 又將之分為 Java for Mobile Devices Java Embedded Java TV Java Card Technology 等等子項 70

1.5.4 JDK 與 JVM 簡介 本書撰寫時,Java SE 的版本為 Java SE 7.0, 因此我們也以 Java SE 7.0 為本書的程式開發套件您可以按下上圖中左方的 Java Platform(JDK) 7, 就可以依照機器種類下載相關套件, 如下圖 圖 1-16 Java SE 7.0 相關下載套件 Windows 32 位元下載此版本 Windows 64 位元下載此版本 71 1.5.4 JDK 與 JVM 簡介 在圖 1-15 的下載網頁中, 我們可以發現到 JDK7 與 JDK7+NetBeans Bundle, 事實上,JDK7 中又包含了一些其他的軟體, 其用途解釋如下 :( 安裝詳見附錄 A) JDK 7:JDK 是 Java Development Kit 的縮寫, 也就是開發 Java 程式所需要的必備工具, 它包含了編譯器 JRE 與 JVM JDK 是我們主要的開發工具, 請下載此套件 JDK 7 + NetBeans Bundle: 按下此圖示超鏈結, 則會出現如 JDK 7 with NetBeans 7.0.1 等軟體, 其中 NetBeans 是一個整合開發環境 (IDE) 見延伸學習, 它包含了 JDK 72

1.5.4 JDK 與 JVM 簡介 Java Runtime Environment (JRE) 7:JRE 是 Java Runtime Environment 的縮寫, 它包含了主要的 API( 即 Java Runtime Classes) 以及 JVM 若只是要執行 Java 程式而不開發 Java 程式, 則在安裝時, 可選擇只安裝 Public JRE 元件, 即可執行 Java 程式 Java SE 7 Documentation: 這是用來說明 Java SE 的技術文件, 對於程式設計師有非常大的幫助, 可以至圖 1-15 網頁的下方尋找, 作為參考手冊 73 1.5.4 JDK 與 JVM 簡介 對於一般使用者而言, 若能取得編譯過的程式 ( 即類別檔 ), 則只要安裝 JRE 來執行即可 對於 Java 程式設計師來說, 則至少必須安裝 JDK 或各種 IDE, 例如 NetBeans 其關係圖如圖 1-17 所示 圖 1-17 Java 套件的關係圖 74

1.5.4 JDK 與 JVM 簡介 延伸學習 :IDE 傳統的編譯程式開發流程有些繁複, 程式設計師必須先用文書編輯器撰寫原始程式檔, 然後再交由編譯器 連結器將原始程式檔編譯為具有除錯功能的可執行檔, 最後經過除錯無誤後, 才重新編譯連結為最終的可執行檔 不過這個流程通常不會一次就完成, 因為程式可能發生語法 語意等錯誤, 而必須在編輯器 編譯器 除錯器間切換許多次, 才能夠得到最後正確的原始程式與執行檔 整合開發環境 (Integrated Development Environment; 簡稱 IDE) 是一套整合性軟體, 它將程式發展所需要的各類軟體整合在同一套軟體之內, 以方便程式設計師開發程式之用 例如對於 Java 語言的 IDE 而言, 它至少必須包含, 編輯器 Java 編譯器 類別庫 JVM 等等 而目前大多數的視窗整合開發環境除了提供這些軟體功能之外, 也提供了許多的視窗套件供程式設計師使用 Java 常見的 IDE 有 Oracle 官方建議的 NetBeans 與最普及的 Eclipse 延伸學習 :API API 是 Application Programming Interface 的縮寫 由於軟體程式日漸龐大, 要從無到有完整開發一個頗具規模的程式幾乎是不可能的任務 因此, 軟體廠商們發展了許多好用的函式庫或類別庫供程式設計師使用, 這些函式庫或類別庫有時統稱為 API, 例如微軟提供了 Win32 API, 可用來發展 Windows 視窗程式 在 Java 領域中,Oracle 也提供了 Java Runtime Classes 類別庫, 我們將在本書中大量使用這些類別庫所提供的類別來設計程式 75 1.5.5 Java 的特色 在學習 Java 之前, 我們若先對 Java 有一些初步的認識, 可減少學習過程中產生的困惑, 簡單來說,Java 語言具有下列特色 ( 含優點與缺點 ): 1 Java 可快速開發各類應用程式 : Java 是一個物件導向語言, 早期由 Sun 主導推動, 又有 IBM Oracle Google 等大廠支援, 因此, 類別庫完整且橫跨眾多應用領域, 包含視窗程式 資料庫應用 網路應用 Web 應用 智慧型手機 Android 作業系統應用等等 雖然後來 Oracle 併購了 Sun 之後, 與 Google 處於競爭者的態勢, 但從另一個角度來看, 正是因為 Oracle 重視 Java, 所以才與 Google 產生嫌隙 76

1.5.5 Java 的特色 2 Java 易學 : 對於物件導向程式語言來說,Java 屬於比較容易學習的一種程式語言, 它去除了 C++ 的多重繼承, 使得學習上較為容易 3 Java 可完全跨平台 : Java 利用虛擬機器的觀念, 使得能在各平台上執行 Java 程式 ( 因為實際上是在 JVM 內執行 ) Java 編譯器會將原始程式碼編譯為 Bytecode, 而各平台都有適用的 JVM 可以執行 Bytecode, 更換平台不但不必重新撰寫程式, 甚至也不必重新編譯程式 77 1.5.5 Java 的特色 4 JVM 可跨語言 : 早期的 JVM 只有 Java 將之視為執行的虛擬機器, 在微軟的.NET CLR 成功跨語言後,JVM 也踏上此途, 現在也有些編譯器可以將其他程式語言原始碼編譯為 Bytecode, 甚至還支援動態型別程式語言 ( 如 JavaScript 或 Ruby), 這使得 Java 具備了未來的發展性 5 Java 是結構獨立的 : 這和跨平台有極類似之處, 但此處強調的是 Java 面對的是虛擬機器, 因此可以假定 Java 程式要執行的平台永遠是相同的, 也就是 Java Virtual Machine 而上述跨平台所強調的是 Oracle 必定會提供各類平台所需的 JVM 由這兩點, 因此, 早期 Sun 提出一個保證的口號,Write once, run anywhere ( 簡稱 WORA), 也就是只要撰寫一次, 就可以在各平台上執行 78

1.5.5 Java 的特色 6 Java 比較安全 : Java 去除了 C/C++ 語言的指標 (Java 不允許程式設計師直接使用指標 ), 因此降低了記憶體存取錯誤的機會 同時,Java 在 JVM 中, 也加入了許多的安全機制, 以保證安全地在沙箱 (Sandbox) 中執行 Bytecode, 其步驟如圖 1-18 所示 圖 1-18 JVM 的細節 79 1.5.5 Java 的特色 7 Java 軟體容易發佈 : 由於 Java 提供了 Applet 機制, 可嵌入在瀏覽器內, 因此有助於軟體的發佈 並且當客戶端未安裝 JVM 時,Applet 也可主動要求使用者下載 JVM 以執行 Java Applet 8 Java 是一種極佳的教學程式語言 : Java 不但簡單, 並且也是純物件導向語言, 因此有助於讓學生從物件的角度來設計程式, 並且又提供了眾多的 API, 足以在教學上取代 C++ Object Pascal 等傳統物件導向語言 80

1.5.5 Java 的特色 9 Java 速度快又慢 : 這看似矛盾, 但其實指的是兩個不同層次的比較 使用 Java 開發的應用程式, 整體而言, 執行速度比 C++ Delphi 還要慢, 這是公認的弊病, 不過 Sun/Oracle 也致力改善這個現象, 但由於 Java 先天性的結構因素, 只要是與作業系統有關的作業 ( 例如檔案處理 ), 都必須等到 JVM 讀取到 Bytecode 中的指令後, 再由 JVM 另外向作業系統提出要求, 多了一道手續, 因此速度勢必比較慢 但若只和傳統使用直譯器的程式語言比較起來,Java 已經算是快的了, 而且 Java 還支援多執行緒, 可透過多工方式, 加速工作的完成 甚至,Oracle 在 Java SE7 的發表會中也敢聲稱, 如果現在還說 Java 發展的應用程式速度比較慢, 那一定是程式本身有問題, 而不是 JVM 的問題, 由此可見,Oracle 在 JVM 與編譯器上的用心 81 1.5.5 Java 的特色 10 Java 能夠充分利用記憶體 : Java 雖然需要啟動 JVM 來執行程式, 但它也支援動態載入機制, 可以在需要某個物件時, 才將物件載入, 因此 JVM 所使用的記憶體能夠有效的被利用 此外,Java 還支援記憶體回收管理機制可收回成為垃圾的記憶體, 並再度利用這些記憶體 11 Java 是穩固的 (robust): Java 支援例外機制, 使得程式設計師可以針對各種例外狀況加以處理, 以求交付更穩固的應用程式給客戶 82

1.5.6 Java 的相關工具 通常大家隨口所說的 Java 包含了三大部分亦即 Java 語言本身 JVM 以及相關的類別庫 如果我們要開發 Java 應用程式, 至少須下載並安裝 JDK( 如果您想要安裝 NetBeans 之類的 IDE 也可以 ) 因為 JDK 包含了最重要的 Java 編譯器 各層級的 API 以及執行用的 JVM, 如下圖 圖 1-19 JDK 已包含所有必須的工具 圖片取自 Java Docs 83 1.5.6 Java 的相關工具 由上圖的第二層中, 我們可以發現到許多的工具, 我們列舉幾個重要工具的功能, 說明如下 : javac: 這是 Java 的編譯器, 可將.java 原始檔編譯為.class 類別檔 java: 這是 JVM 虛擬機器的執行檔, 可用來執行 Java Application 的 Bytecode( 也就是.class 類別檔 ) 註 本書介紹的 Java 程式可以分為兩大類, 本文的所有 Java 程式皆為 Java Application, 而電子附錄介紹的程式則為可在瀏覽器中執行的 Java Applet 84

1.5.6 Java 的相關工具 javadoc: 這個工具可以將 Java 的特殊註解輸出為 HTML 格式 ( 類似 Java document 格式 ) jar: 可將.class 檔包裝成壓縮檔的工具 javap: 可反組譯.class 檔的工具 註 下載與安裝 JDK, 請見附錄 A 85 1.6 編譯與執行範例 在本節中, 我們將直接編譯一個 Java 程式並執行它 您不需要了解該程式, 程式設計的細節將在後面章節中陸續介紹 在此, 請您先按照附錄 A.1~A.3 的指示, 安裝 JDK 等相關工具並設定工作環境後, 按照下列範例進行編譯與執行 實作範例 1-1 編譯與執行一個 Java 程式 86

1.6 編譯與執行範例 Step0: 將光碟的範例檔 ch1_01.java, 預備在 C:\myJava\ch01\ 中 Step1: 開啟 Dos 視窗 執行 開始/ 所有程式 / 附屬應用程式 / 命令提示字元 指令 執行 87 1.6 編譯與執行範例 Step2: 切換到 C:\myJava\ch01\ 假設您位於其他磁碟槽, 請先輸入 C:\ <Enter> 若已位於 C 槽, 請直接輸入 cd\myjava\ch01\ <Enter> 輸入 cd\myjava\ch01\ <Enter> Step3: 執行編譯, 輸入 javac ch1_01.java <Enter> 輸入 88

1.6 編譯與執行範例 Step4: 此時會多出一些類別檔, 當中主類別檔之名稱為 ch1_01.class 您可使用 dir 指令觀察, 結果如下 輸入 Step5: 開啟另一個 Dos 視窗 執行 開始 / 所有程式 / 附屬應用程式 / 命令提示字元 指令 ( 同 Step1) 89 1.6 編譯與執行範例 Step6: 切換到 C 槽根目錄 假設您位於其他磁碟槽, 請先輸入 C:\ <Enter> 若已位於 C 槽, 請直接輸入 cd\ <Enter> 輸入 Step7: 請 JVM 執行程式, 輸入 java myjava.ch01.ch1_01( 後面不加副檔名 ) <Enter> 輸入 90

1.6 編譯與執行範例 Step8: 此時會出現一個視窗 我們將在第 16 章學習如何製作此視窗程式, 目前您只要學會如何編譯與執行程式即可 最後請按視窗右上角的關閉鈕關閉視窗 91 1.6 編譯與執行範例 說明 1. 在這個範例的 Step1 與 Step5, 我們分別開啟兩個 Dos 視窗, 一個用來編譯, 一個用來執行類別檔 這是筆者的習慣, 如果您不覺得切換目錄麻煩的話, 也可以只使用一個 Dos 視窗完成工作 2. 使用 java 執行程式時, 後面不加上.class 副檔名, 因為 java 本身已經預設目標檔為類別檔 若再加上.class 副檔名, 則會認為目標檔為 ch1_01.class.class 92

1.6 編譯與執行範例 說明 3. 使用 java 執行程式時, 前方的 myjava.ch01 代表類別庫名稱,Java 規定使用目錄層級作為類別庫分類, 並且將目錄分隔符號 \ 改為. 在第 11 章之前, 我們都會採用相同的方式執行程式而在第 11 章介紹介紹類別庫時, 則會深入探討以環境變數 CLASSPATH 設定類別路徑的方式執行類別檔 93 1.7 本章回顧 在本章中, 我們首先介紹了 Java 的特色以及開發工具, 重點如下 : 1.Java 是一個高階語言, 也是一個純物件導向程式語言 2.Java 提供了眾多的 API, 可以方便程式設計師快速完成許多應用程式 3.Java 同時採用編譯器與直譯器的方式翻譯與執行程式 4.Java 的編譯器為 javac.exe, 可將.java 程式檔翻譯為.class 類別檔 94

1.7 本章回顧 5.Java 的直譯器為 java.exe, 也就是 JVM(Java Virtual Machine), 可以執行.class 類別檔 6..class 類別檔的內容為 bytecode, 只要在不同平台使用不同的 JVM, 就可以執行.class 類別檔, 因此 Java 具有絕對的可攜性 7.JDK 是 Java 的開發工具, 當中包含了 Java 的編譯器, 眾多 API 以及執行 Java 程式的 JVM 同時在本章中, 我們也透過範例, 示範如何編譯一個 Java 原始程式, 以及如何執行類別檔 95 1.7 本章回顧 除了 Java 本身之外, 我們也簡單介紹了物件導向程式設計的原理 物件導向程式設計是一個以物件為基礎的設計方式, 藉由物件之間的互動完成程式需要的功能而物件則包含了專屬於它的屬性及方法, 藉由這些方法, 可以使得物件具有某些功能 類別是同類物件的集合 96

1.7 本章回顧 簡單來說, 撰寫 Java 程式就是在撰寫類別程式碼 而物件則是由類別生成的實體, 在建立類別的實體物件時, 給予不同的屬性就能形成不同的物件, 這些物件同時都可以執行由該類別定義的方法, 也具有該類別定義的屬性 ( 但屬性值則可以不同 ) 除此之外, 物件導向程式設計還包含三大特性 即封裝性 繼承性與多型性 我們將於後面章節中陸續介紹 Java 如何完成這些特性 97 本章結束 Q&A 討論時間 98