第二章 Java 從零開始 (Java 程式的基本結構 ) 課前指引在本章中, 我們將透過一個非常簡單的 Java 程式來說明 Java 的程式結構 章節大綱 2.1 最簡單的 Java 程式範例 2.2 註解 (comment) 2.6 Java 程式的進入點 main( ) 2.7 Java 的敘述 2.3 package 區 2.4 import 區 2.8 println() 輸出方法的簡易使用法 2.9 自由格式與空白字元 2.5 類別區 2.10 Eclipse IDE 的活用 備註 : 可依進度點選小節 2.11 本章回顧
課前指引 在第一章中, 相信讀者已經熟悉如何編譯 Java 程式 在本章中, 我們將透過一個非常簡單的 Java 程式來說明 Java 的程式結構 並且從本章開始, 我們將實際撰寫每一個 Java 範例程式, 在撰寫程式之前, 我們必須先提醒讀者以下幾件事 (1) 所有的範例原始程式, 其副檔名皆為.java 3 課前指引 (2) 寫程式就和學數學一樣, 必須親手練習, 每當讀者看完一個範例之後, 請自行動手將程式內容一個字一個字的輸入到檔案中 並且詢問自己, 本行程式的意義為何, 是否可以略過以及改寫 除此之外, 我們並不建議讀者強記各種指令敘述及語法細節, 但由逐字輸入及練習撰寫程式的過程中, 讀者將自然地記住這些指令敘述及語法 同時,Java 的各類 IDE 也能提供方便撰寫程式的環境 4
課前指引 (3) 寫程式著重在邏輯思考能力的培養, 從第 4 章開始將會介紹一些程式的控制流程讀者在思考新問題的解答或觀看範例時, 若一時無法理解程式, 請盡可能畫出對應的流程圖, 如此將有助於學習程式的控制流程 (4) 萬丈高樓平地起 ; 寫程式就像是堆積木一樣任何一個大型程式都是由小型程式 類別 函式或程式區塊所組成 因此當學習完本書所有範例時, 不必懼怕開發中大型程式的挑戰 註 : 雖然物件導向程式語言對於開發大型程式有利, 但開發有效率的大型程式尚須要配合軟體工程的理論以及系統分析的能力, 此時您可能需要更多有關於這方面的訓練 5 2.1 最簡單的 Java 程式範例 下面是一個簡單的 Java 程式範例, 請逐字將之輸入到副檔名為.java 的檔案中同時,Java 程式的主檔名與程式內容有關, 我們將在後面 解釋其相關性 若您的 IDE 已經幫您建立了某些預設內容, 請先將它刪除後再輸入範例 2-1: ch2_01.java ( 隨書光碟 myjava\ ch02\ch2_01.java) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /* 檔名 :ch2_01.java 功能 : 簡單的 Java 程式範例 */ package myjava.ch02; import java.lang.*; public class ch2_01 // 主類別 { public static void main(string args[]) { System.out.println(" 歡迎使用 Java!"); } } class MyClass { } 請先將光碟範例 copy 至 C:\!! // 一般類別 6
2.1 最簡單的 Java 程式範例 執行結果 : C:\myJava\ch02>javac ch2_01.java C:\myJava\ch02>cd\ C:\>java myjava.ch02.ch2_01 歡迎使用 Java! C:\> 非粗體代表程式的輸出 粗體代表使用者的輸入 範例說明 : (1) 程式真正的執行結果只有 歡迎使用 Java!, 其他都是操作命令 其中 javac ch2_01.java 是編譯 ch2_01.java 程式它將會產生 ch2_01.class 及 MyClass.class 兩個類別檔 而 java myjava.ch02.ch2_01 是要求 JVM 執行 ch2_01.class, 必須在 C 槽根目錄下執行 您也可以如同第一章使用兩個 Dos 視窗分別進行編譯與執行 本範例之後的執行結果, 我們將省略這些操作步驟, 直接印出執行結果 7 2.1 最簡單的 Java 程式範例 (2) 雖然範例 2-1 是一個只有 18 行的 Java Application 程式, 但是卻說明了 Java Application 的基本結構如下, 我們將分別加以說明 圖 2-1 Java Application 原始程式的基本結構 8
2.2 註解 (comment) 在程式的任何地方都可以加入註解, 而這些註解對於編譯器而言是沒有意義的, 沒有這些註解並不會影響程式的正確性 所以這些註解文字可以當作說明該程式或程式片斷之用, 善用註解文字將有助於日後維護程式時, 快速了解該段程式的功用 9 2.2 註解 (comment) Java 的註解符號有三種如下 : 區塊註解符號 /* */ 在 /* 到 */ 之間的所有文字 ( 可跨行 ) 都將被編譯器忽略 例如範例 2-1 的第 1~4 行為註解 一般說來, 由於區塊註解具有跨行效果, 因此為了明顯起見, 我們會在隔行處多加上一個 * 來表明 ( 但有無星號都不影響註解效力 ), 並且將星號對齊 例如第 1~4 行的註解改寫如下較佳 : /* * 檔名 :ch2_01.java * 功能 : 簡單的 Java 程式範例 */ 10
2.2 註解 (comment) Java 的註解符號有三種如下 : 單行註解符號 // 小試身手 2 1 Java 也提供了一種單行註解符號 //, 凡是 // 之後的整行文字都會被視為註解 例如範例 2-1 的第 8 16 行的後半段為註解 而第 1~4 行的註解也可以改寫如下 //------------------------------- // 檔名 :ch2_01.java // 功能 : 簡單的 Java 程式範例 //------------------------------- 將範例 2 1 的第 1~4 行刪除, 並修改為如上的單行註解格式, 然後重新編譯與執行, 看看執行結果是否相同? 11 2.2 註解 (comment) Java 的註解符號有三種如下 : 文件註解符號 /** */ 文件註解只有在使用 Javadoc 工具製作說明文件時有用事實上, 文件註解對於編譯器而言, 與區塊註解完全相同, 因為都是由 /* 開始, 到 */ 結束 Javadoc 是一個程式, 它可以將您的 Java 程式說明萃取成 HTML 檔案, 這些 HTML 檔與 JDK 說明文件的 HTML 具有相同的外觀, 其中包含類別 介面 變數 方法等相關資訊 在本書中, 我們將不使用這種註解格式, 有興趣的讀者, 可以於學會 Java 後參閱下列網址, 利用文件註解製作說明文件 : http://www.oracle.com/technetwork/java/javase/document ation/index-jsp-135444.html 12
2.3 package 區 package 區是用來宣告該檔案中的類別屬於哪一個 Package( 類別庫 ), 必須出現在程式的最上方, 且只能有一個 換句話說, 一個 Java 程式檔最多只能隸於一個 Package, 以便於管理 如果不想要將該程式隸屬於任何 Package, 則可以省略 package 區的宣告, 此時程式檔將隸屬於 預設的 Package 13 2.3 package 區 Package( 也可翻為程式包裹 ) 是管理類別 (Class) 的容器, 在 Java 中, 管理套件採用檔案系統的目錄結構方式來管理, 對於開發大型程式而言, 應該善用 Package 管理各個類別 重點如下 : 1. 同一個 Package 內的類別名稱不能重複, 因此有助於跨檔案開發程式時的管理 2. 相關類別通常被放在同一層目錄, 以便方便管理及存取 3. 可開發屬於自己或公司的類別程式庫 4. 程式設計人員可以很容易取用所需要的類別 14
2.3 package 區 套件管理以目錄方式來管理, 是基於檔案系統的習慣做為出發點, 而 Java 也延續此一特點將 Package 對應到所屬的目錄結構 舉例來說, 範例 2-1 位於 C:\myJava\ch02\ 目錄內, 因此, 我們可以將目錄路徑 myjava\ch02\ 的目錄階層符號 \ 改為. 作為 Package 名稱, 亦即 myjava.ch02 如此一來, 就可以確保 Package 的唯一性 15 2.3 package 區 是否宣告或如何宣告 Package 在編譯時 ( 使用 javac.exe 編譯 ) 是毫無影響的, 只有在 JRE 執行時 ( 使用 java.exe 執行 ) 才會有所影響 所以在範例 2-1 的執行結果中, 我們由於宣告了 Package, 因此執行時, 必須先使用 cd\ 切換到根目錄然後才能執行 ch2_01.class 類別檔, 否則 JRE 會找不到 ch2_01.class 類別檔 16
2.3 package 區 第 3~10 章的程式中, 我們都將 package 宣告為 myjava.chxx, 因為我們的程式將會放在 myjava\chxx 目錄中, 而編譯後的 class 檔案將與 java 原始檔位於同一目錄下 待第 11 章後, 宣告的 package 將會產生變化, 而我們也將在第 11 章說明宣告 package 的細節 17 2.3 package 區 如果我們把 package 那一行刪掉或把它變成註解, 則 ch2_01.java 將屬於預設的 package, 我們可在該目錄下直接用 java 命令執行! 18
2.3 package 區 如果我們用 Eclipse IDE 來執行範例程式 ( 用 import 命令 ), 道理亦相同, 把 package 那一行 mark 或刪去即可 19 20
21 22
23 24
25 26
2.4 import 區 在開發 Java 程式時, 或多或少我們會使用到一些現成的類別 (class), 以縮短程式開發的時程 這些現成的類別可能是由 JDK 或其他廠商所提供的, 也可能是自己先前已開發完成的 無論如何, 想要引用這些類別, 就必須先將其在 import 區中宣告 且 import 區必須位於 package 區之下, 所有類別區之上, 以便讓編譯器或執行器一開始就能夠找到類別所在位置 27 2.4 import 區 Java 的類別使用類別庫 (package) 來管理, 而類別庫則是採用目錄階層式管理, 為了方便使用, 我們可以採用 * 代表該階層的所有類別 ( 但不包含子目錄 / 子類別庫內的類別 ) 例如在範例 2-1 中,import java.lang.*; 代表的就是引用 java.lang( 這是一個 JDK 提供的 Package) 下的所有類別 例如 java.lang.object 與 java.lang.string 28
2.4 import 區 事實上,Java 的所有類別全部都繼承自 java.lang.object 換句話說, 只要程式中未指定父類別的類別, Java 都會自動指定 Object 作為其父類別 例如在範例 2-1 中第 16 行的 MyClass 就是以 Object 做為父類別, 所以應該要引入 java.lang.object, 而我們則以 java.lang.* 做為引入類別庫的宣告 29 2.4 import 區 由於 java.lang 類別庫存放著大量常使用的類別 ( 例如字串類別 數學類別 Object 類別等 ), 所以 Java 會自動引入 java.lang 類別庫 故而省略範例 2-1 的 import java.lang.*;, 並不會造成程式的錯誤 但對於 Java 不會自動引入的類別庫, 則必須明確宣告其 import 來源 延伸學習 :include 與 import 的不同 對於了解 C/C++ 的讀者而言, 可能會把 import 和 C/C++ 的 include 當成是一樣的, 但其實兩者還是有些許不同 就功能面上而言, 兩者確實是相同的, 都是用來引入 library 但 C/C++ 的 include 會把 library 在編譯時期全部加入程式中, 而 Java 的 import 並不會匯入 class 到程式內, 它只是告知編譯器該 class 的路徑在哪裡, 否則 * 機制會使得程式大到離譜 30
2.5 類別區 Java 是一個物件導向語言, 以類別做為單位, 所以每一個 Java 程式必須有一個主類別才能夠被執行 除了主類別外, 我們也可以依照需要自行定義一般類別 31 2.5.1 主類別區 主類別是程式中不可或缺的類別, 並具有下列特點 : 1. 主類別具有唯一性, 必須要有主類別, 且只能有一個主類別 2. 必須包含一個主函式 main(), 稱之為 main() method, 並且 main() 是整個程式的執行起始點 3. 封裝等級必須宣告為 public, 且只有主類別可以宣告為 public ( 預設為 public, 所以 public 可省略 ) 4. 主類別名稱必須與主檔名相同 ( 不含副檔名 ) 5. 修飾字的宣告只能宣告為 abstract final 或省略不寫 32
2.5.1 主類別區 基於上述特點, 我們可以將主類別的格式整理如下 : 圖 2-2 主類別格式 ( 格式中,[] 代表可以省略不寫 而 / 代表選其一 ) 33 2.5.1 主類別區 主類別區說明 : 1.public 是封裝等級我們會在繼承與封裝一章中說明目前只需要了解主類別一定要宣告為 public 即可 2.abstract/final 是修飾字同樣我們會在後面慢慢說明 目前我們都先暫時省略 ( 不寫 ) 修飾字 3. 主類別名稱必須與主檔名相同例如範例 2-1 的檔名為 ch2_01.java, 所以主類別名稱為 ch2_01 4.[extends 父類別 ] 是用來宣告繼承自哪一個父類別例如要撰寫 Applet 程式, 就要宣告為 extends Applet 目前我們都先不寫 34
2.5.1 主類別區 主類別區說明 : 5.[implements 介面名稱 ] 是用來宣告實作哪一個介面例如要撰寫多執行緒程式, 就要宣告為 implements Runnable 目前我們都先不寫 6. 宣告變數 (variable) 是在類別中宣告屬於該類別的變數 ( 也就是欄位 ) 格式說明請見 2.5.3 節 35 2.5.1 主類別區 7.main method 存取等級必須是 public 並且使用 static 宣告為 class method void 代表沒有回傳值 所以前面的 public static void 是固定不可以改變的 至於 () 內 String[] args String []args String args[] 則為 main 的參數, 也就是用來接受命令列執行時後面的引數, 它是以字串格式傳入 ( 三種都是傳入字串陣列的格式, 擇其一即可,args 為陣列名稱, 可取其他名稱代替 ) 8. 除了 main method 之外, 我們也可以宣告其他屬於主類別的 method 格式說明請見 2.5.4 節 36
2.5.1 主類別區 延伸學習 : 術語的不同不同的物件導向程式語言採用不同的術語, 例如在上一章所介紹的屬性, 其意義代表屬於該類別的變數 但在 C++ 中,C++ 將類別所屬的變數稱之為成員變數 (member variable), 將類別所屬的函式稱為成員函式 (member function) 而 Java 則將類別所屬的變數稱之為變數 (variable) 或欄位 (field), 將類別所屬的函式稱為方法 (method) 更有甚者, 如 VB.NET 的欄位與屬性並不相同,VB.NET 的屬性具有類別所屬變數的意義, 但本質上卻是透過特定的 Get Sét 程序 ( 函式在 VB.NET 中稱之為程序 ) 來完成變數值的設定 37 2.5.1 主類別區 延伸學習 :Java 的變數 Java 的變數一共可分為四種, 實體變數 (Instance Variables) 類別變數 (Class Variables) 區域變數 (Local Variables) 參數 (Parameters), 其意義如下, 我們將於後面章節中陸續介紹 參數 : 只使用在 method 呼叫時接收傳遞資料之用 ( 詳見第 6 章說明 ) 區域變數 : 僅限用於某個 method 之內的變數 實體變數 : 隸屬於某個物件的變數 必須透過物件才能存取該變數 類別變數 : 隸屬於某個類別的變數, 所有由該類別產生的物件都共用此變數, 並且不需要產生物件, 就可以透過類別存取該變數 類別變數必須使用 static 關鍵字宣告 在圖 2 2 中, 有一塊 宣告變數 區, 該區是宣告實體變數與類別變數, 兩者的差別在於是否使用 static 關鍵字宣告 38
2.5.2 一般類別區 一般類別的規定比主類別少, 格式可以整理如下 : 說明 : 在第 6 章之前, 我們都不會使用到一般類別, 所以我們將於第 7 章再一併說明 圖 2-3 一般類別格式 ( 格式中,[] 代表可以省略不寫 ) 39 2.5.3 類別的變數 在類別的變數定義區中定義的變數, 稱為該類別的成員變數 (member variable), 或欄位 (fields) 有時為了方便說明, 也會以成員資料來解釋 成員變數代表該類別專屬的資料欄位, 若類別生成物件後, 將會是物件的資料項目 在類別宣告單一變數的語法如下 : [ 封裝等級 ] [ 修飾字 ] 資料型態變數名稱 ; 40
2.5.3 類別的變數 說明 : 定義成員變數可在前宣告封裝等級 ( 我們將在類別與物件一章中說明各種封裝等級 ) 若未加上 static 修飾字, 則該變數將存在於該類別生成的每一個物件中, 且彼此獨立, 稱為實體變數 (Instance variable) 若使用 static 宣告, 則每一個物件都共用該變數, 稱為類別變數 (class variable) 資料型態可以分為原始資料型態與非原始資料型態, 我們將於下一章說明 變數名稱可自由選擇由多個 Unicode 字元構成的識別字 (identifier) 但不能是 Java 的關鍵字 true false 及 null 等保留字 Java 的關鍵字及保留字如下 : 41 2.5.2 一般類別區 class Car { private double weight; // 實體變數 public static int count; // 類別變數 ; 例如 : 共有幾個物件 public void realshow() { } public int compare(int a, int b) {. return 0; } } class aaa {. } 物件 1 weight; realshow() compare() 類別 Car count; new new new 物件 2 weight; realshow() compare() 物件 3 weight; realshow() compare() 42
2.5.3 類別的變數 abstract boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while 老師的叮嚀 上述的 Java 關鍵字 (Keyword) 都具有特殊意義, 我們將於本書的各章節中陸續加以介紹 至於 goto 等保留字 (reserved word) 雖然在 Java 中沒有任何意義, 但由於在一般程式語言中具有特殊意義, 因此,Java 將之列為保留字, 同樣不可以做為變數名稱 方法名稱或類別名稱 43 2.5.3 類別的變數 Coding 注意事項 識別字其實包含兩大類, 一類是由使用者所定義, 另一類則是由編譯器內定 由編譯器內定的識別字為關鍵字或保留字 而使用者定義的識別字, 則是做為變數名稱 方法名稱 類別名稱 常數等等 雖然這些識別字可以由任意的 Unicode 字元構成, 但不可以在其中包含空白字元及 # $ 等特殊符號, 同時數字只能在第二個字元後出現 並且 Java 的識別字具有大小寫之分, 例如 Length 與 length 是不同的兩個識別字 44
2.5.3 類別的變數 Coding 偷撇步 雖然使用者可自行定義識別字, 以做為變數 方法 類別等名稱, 但最好取一些有意義的單字或組合字, 以便於日後的維護 而在 Java 的內建類別中, 我們可以發現一些 識別字的命名規則, 您可以跟隨相同的命名規則來進行識別字的命名 : 常數 : 全部字元都使用大寫, 若包含兩個單字以上, 則可以在其中加上底線, 例如 :PI,MAX_LEN 變數 : 全部字元都使用小寫, 但若為兩個單字以上, 則第二個單字開頭字母為大寫, 例如 :width,rectwidth,varrectwidth 方法 :( 同變數名稱命名規則 ) 全部字元都使用小寫, 但若為兩個單字以上, 則第二個單字開頭字母為大寫, 例如 : show,cal,calarea,calrectarea 類別 : 第一個字母為大寫 ( 通常可命名為 C, 代表 class), 其後由一個單字以上組成, 每個單字的開頭字母為大寫, 其餘為小寫, 例如 :CPerson,CStack,CCircularQueue 45 2.5.4 方法 在類別的成員定義區中定義的方法 (method) 也稱為該類別的成員函式 (member function) method 的定義格式如下 : 回傳值型態 [ 修飾字 ] method 名稱 ( 資料型態參數 1, 資料型態參數 2, ) { 程式敘述群 ( 含區域變數的宣告 ) [return 運算式 ;] } 說明 : 1. 程式透過邏輯來完成其目的, 而方法就是 Java 程式用以實作程式邏輯之處 2. 程式敘述群中包含許多的 Java 合法敘述, 其中也包含區域變數的宣告 46
2.5.4 方法 3.return 是用來中斷 method 的執行, 並且可以回傳資料, 如果不想回傳資料, 則回傳值型態應該宣告為 void 4. 宣告方法時, 若未加上 static 修飾字, 則該方法必須由該類別生成的物件來執行, 稱為實體方法 (Instance method) 若使用 static 宣告, 則該方法可以直接透過類別指定的方式來執行, 稱為類別方法 (class method) 5. 參數是做為接收傳遞變數之用, 它可以做為該 method 內的合法變數來使用, 而不必再宣告一次 47 2.5.4 方法 public class aaa { public static void main(string[] args) { Car car1 = new Car();// 產生新物件 Car1 car1.setweight(1000.0); car1.showweight(); Car.Shownum(); Car car2 = new Car();// 產生新物件 Car2 car2.setweight(2000.0); car2.showweight(); Car.Shownum(); Car.Avg_weight(); } } 類別 Car: count; // 類別變數 total_weight; // 類別變數 Shownum();// 類別方法 Avg_weight ();// 類別方法 new 物件 1: weight=1000.0;// 實體變數 ShowWeight();// 實體方法 setweight ();// 實體方法 new 物件 1: weight=2000.0;// 實體變數 ShowWeight();// 實體方法 setweight ();// 實體方法 48
2.5.4 方法 class Car { public static int count=0;// 類別變數 public static double total_weight=0.0;// 類別變數 private double weight=0.0;// 實體變數 public Car() {count=count+1;}// 建構子 public static void Shownum(){// 類別方法 System.out.println("Toral Car Number is:"+count); } public static void Avg_weight(){// 類別方法 System.out.println(" 平均重量為 :"+(total_weight/(double)count)); } public void setweight(double a){// 實體方法 weight=a;total_weight=total_weight+weight; } public void ShowWeight(){// 實體方法 System.out.println("Car Weight is:"+weight); } } 49 2.5.4 方法 50
2.5.4 方法 6. 程式的運作是依靠變數的變化來完成 變數對於程式設計師而言, 是一個運用對象, 而對於電腦而言, 則會佔據某一小塊記憶體以保存資料 在 method 內宣告的變數稱為區域變數, 它的宣告語法與類別變數宣告類似, 不過不包含封裝等級 7. 宣告區域變數與其他敘述可以交錯進行, 但只有宣告過的區域變數才能夠被使用 51 2.6 Java 程式的進入點 main( ) 一個完整的 Java 程式必定有一個唯一的主類別 ( 主類別名稱同檔名 ), 而主類別中必定有一個唯一的 main 方法, 該方法將是整個程式的進入點 ( 即起始點 ) main public static 方法的格式如下 void main(string[] args/string : []args/string args[]) { 程式敘述群 [return;] } 52
2.6 Java 程式的進入點 main( ) 說明 : (1)main 方法的存取等級必須是 public, 並使用 static 宣告為 class method, 其中的 void 代表沒有回傳值 所以前面的 public static void 是固定不可以改變的 (2) 至於 () 內的參數可以為 String[] args 或 String []args 或 String args[], 它可以接受命令列執行時後面的引數 ( 三種都是傳入字串陣列的格式, 擇其一即可,args 為陣列名稱, 可取其他名稱代替 ) 我們將於函式一章中再詳述, 目前暫時不對參數進行任何應用 (3) 程式敘述群包含宣告區域變數與其他敘述, 並可交替交錯進行, 但只有宣告過的區域變數才能夠被使用 (4)return 可以提前中斷 main 方法的執行, 當 main 方法執行完畢 ( 執行到最後一行或遇到 return), 則整個 Java 程式就執行完畢 53 2.7 Java 的敘述 (statement) Java 的程式由類別組成, 而類別內則包含了定義變數及方法, 在各方法內則包含宣告區域變數以及其他各類敘述 換句話說, 程式是由許多的敘述所組成, 您也可以把敘述當作是指令來看待, 即每一個敘述代表要求 JVM 進行某項運作 54
2.7 Java 的敘述 (statement) Java 的敘述分為許多種類, 我們將於後面章節中陸續介紹, 而這些敘述又可以依照數量分為單一敘述與區塊 (block) 敘述 區塊敘述又稱為區段 (segment), 它包含了一個以上的敘述, 因此必須使用一對大括號 {} 包裝起來 {} 在 Java 的程式中時常可以看到, 其目的都是為了將多個敘述包裝起來成為一個區段, 例如 main 方法底下的 {} 之間的所有敘述, 就是代表 main 方法所要執行的指令, 我們也可以稱之為 main 方法的主體 55 2.7 Java 的敘述 (statement) 其他如類別之下, 也會出現 {}, 其中所包含的則稱為該類別的主體 在往後的章節中, 在介紹某些敘述時 ( 如 if 敘述 ), 也會看到 {} 的出現, 其主要目的都是為了將許多單一敘述集合起來, 當作一個單位來看待 圖 2-4 類別與方法主體 56
2.8 println() 輸出方法的簡易使用法 在範例 2-1 中,main 方法的主體內只包含了單一個敘述 System.out.println(" 歡迎使用 Java!"); System 類別的全名是 java.lang.system, 故我們在第 6 行 import java.lang.* 事實上, 由於 java.lang 太常被使用, 所以即使未將之 import, 編譯器仍然會內定自動將之 import 進來 57 2.8 println() 輸出方法的簡易使用法 out 是 java.lang.system 的一個靜態欄位 ( 類別變數 ), 其型別為 PrintStream 類別因此,println 是 PrintStream 類別的一個方法 System.out 代表的是標準輸出, 通常指的是螢幕或印表機等 ( 預設為螢幕 ) println 之意為 print 與 line, 代表印出文字並且換行 此外, 還有一個方法稱為 print, 其功能則是單純印出文字而不換行 58
2.8 println() 輸出方法的簡易使用法 在範例 2-1 中, 我們使用 System.out.println 印出了一段文字 歡迎使用 Java! 並換行 其中, 我們將該段文字以 " 包裝起來, 代表一個字串常數事實上,System.out.println 除了能夠印出字串常數之外, 還能夠印出各類常數與變數的值 我們將於下一章中看到更多關於 System.out.println 與 System.out.print 的使用範例 請注意, 在這兩個方法中, 如果要列印的資料不只一筆, 則可以利用 + 來將之連結, 並且 + 在 Java 中, 也可以作為連結字串之用 59 2.8 println() 輸出方法的簡易使用法 public class aaa { public static void main(string[] args) { // TODO Auto generated method stub System.out.println("Hello World!"); } } 60
2.8 println() 輸出方法的簡易使用法 public class aaa { publicstaticvoidmain(string[] args) { // TODO Auto generated method stub System.out.println("Hello World!" + " Have a nice Day"); System.out.println( WaHaHa"); } } 61 2.8 println() 輸出方法的簡易使用法 public class aaa { public static void main(string[] args) { // TODO Auto generated method stub System.out.print("Hello World!"); System.out.print(" Have a nice Day"); } } 62
2.8 println() 輸出方法的簡易使用法 public class aaa { public static void main(string[] args) { // TODO Auto generated method stub int num1=2,num2=3; System.out.print("I have "+num1+" dogs,"+"you have "+num2+"cats."); } } 63 2.9 自由格式與空白字元 Java 語言採用自由格式撰寫, 換句話說, 您可以去除程式中各敘述間的所有空白字元 ( 包含 spaces tabs 等等 ) 及換行符號 (carriage return), 編譯器仍會正確編譯程式 例如 : 您可以將範例 2-1 中主類別的內容改寫如下 : public class ch2_01 // 主類別 { public static void main(string args[]) { System.out.println(" 歡迎使用 Java!"); } } 64
2.9 自由格式與空白字元 雖然省略空白字元以及換行符號能夠使得程式行數減少, 但並不會加速程式的執行效率, 因為不論是範例 2-1 的表示法或上述表示法, 編譯器都將產生相同的輸出結果 不過上述的撰寫格式, 則比範例 2-1 更難以閱讀 因此, 為了日後維護的方便, 強烈建議讀者應該培養程式碼縮排及適當換行的習慣 Coding 注意事項 " 內的空白字元不會被編譯器忽略, 因為 " 在 Java 語言中, 是用來包裝字串常數 65 2.10 Eclipse IDE 的活用 在前面章節中, 我們採用的是編輯器 ( 如記事本 )+javac.exe+java.exe(jvm) 來編輯 編譯與執行 Java Application 本書建議, 初學者盡量以此模式來學習本書, 比較能夠理解 Java 的架構 但在學會 Java 之後, 為了方便開發更大型的專案, 不可避免地, 應該搭配 IDE 的協助以縮短開發時程並利於管理因此, 建議讀者參照附錄 B 的指示, 下載 安裝 設定與執行 Eclipse IDE 例如在 Eclipse 中執行範例 2-1 的結果如下圖 : 66
2.10 Eclipse IDE 的活用 執行結果在此 67 複習 Import example from the CDs New Project >New Classes 68
2.11 本章回顧 在本章中, 我們學習了 Java 程式的基本結構 本章所學習的內容如下 : (1)Java 程式的基本結構包含幾大部分 : 程式註解 宣告所屬類別庫 匯入類別 ( 庫 ) 各類別的程式 (2) 在 Java 程式中, 可使用 /* */ 做為註解符號 也可以使用 // 作為單行註解符號 而使用 /** */ 做為註解符號, 還可以透過特定軟體製作程式說明文件 69 2.11 本章回顧 (3)package 區是用來宣告該檔案中的類別屬於哪一個 Package( 類別庫 ), 並且 Java 使用目錄來管理類別庫 程式若無宣告類別庫, 則 Java 將之視同宣告為 預設的 Package 在第 11 章中, 將有更深入的說明 (4)import 是用來記載要使用的類別, 因此, 我們可以使用由別人開發完成的類別庫中的類別或 JDK 提供的類別 (5)import java.lang.*; 可以省略因為 Java 內定會載入 java.lang 類別庫的所有類別 70
2.11 本章回顧 (6) 主類別是包含主函式 main() 的類別, 而 main 則是整個程式的執行起始點 關於主類別的其餘規定如下 : 具有唯一性, 必須且只能有一個主類別 封裝等級必須宣告為 public, 且只有主類別可以宣告為 public( 可省略 ) 主類別名稱必須與主檔名相同 ( 不含副檔名 ) 修飾字的宣告只能宣告為 abstract final 或省略不寫 (7) 除了主類別之外, 程式中也可以撰寫一般類別 我們將於第七章之後開始撰寫一般類別 71 2.11 本章回顧 (8) 類別內包含了變數與方法兩大項成員 在類別的變數定義區中定義的變數, 稱為該類別的成員變數 (member variable) 或欄位 (fields) 若類別生成物件後, 將會是物件的資料項目 程式透過邏輯來完成其目的, 而方法是 Java 程式用以實作程式邏輯之處 (9)Java 的變數一共可分為四種實體變數 (Instance Variables) 類別變數 (Class Variables) 區域變數 (Local Variables) 參數 (Parameters), 我們將於後面章節中陸續介紹 (10) 類別內包含許多敘述, 換句話說, 程式是由許多的敘述所組成, 您也可以把敘述當作是指令來看待, 即每一個敘述代表要求 JVM 進行某項運作 72
2.11 本章回顧 (11)Java 的敘述分為單一敘述與區塊敘述 區塊敘述又稱為區段 (segment), 它包含了一個以上的敘述, 因此必須使用一對大括號 {} 包裝起來 (12)println 是一個方法, 隸屬於 System.out 類別, 可以用來輸出資料到螢幕上 ( 結尾會產生換行作用 ) print 也是隸屬於 System.out 類別的方法, 也可以輸出資料到螢幕上, 但結尾不會產生換行作用 (13) 在 Java 程式中, 除了字串內的空白字元外, 其餘超過一個以上的空白字元並不會對程式產生作用 73 2.11 本章回顧 (14) 在管理與撰寫 Java 應用程式時, 藉由 Eclipse IDE 可以縮短開發時程 例如可自動新增主函式 新增類別時也會自動將主類別對應到主檔名 以上僅為 Java 程式的粗略介紹, 至於細節則將於後面章節中分別加以介紹 74
本章結束 Q&A 討論時間 75