2015年10月27日 星期二

Java 學習日誌 017:Primitive type


之前我們提過primitive type,但是還沒解釋他的意思,primitive type也稱作type(基本形態),也就是Java用來賦予vabiable基本性質的東西,這些基本的性質有字母、各種範圍的整數、各種範圍的小數,以及是否是真或假的性質。下表為Java所有的primitive type以及他們所能賦予的性質。














習慣上在賦予variable整數的性質會用int小數的性質會用doublechar能賦予variable一個字母的性質;boolean則能賦予variable true(真)或false(假)的性質。

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月26日 星期一

Java 學習日誌 016:Variable


在之前的例子裡,我們提過variable(變數),由它的名稱我們可以知道它是還未被定義、非固定不變的,因此要在一個Java程式裡用variable之前,一定都要先宣告(declare)他的特性,簡單講就是要先定義它,以讓你的compiler,以及最終讓你的電腦知道這個variable所持有的特性。舉例來說,以下是在Java程式裡有可能會遇到的兩個對於variable的宣告。

int numberOfBeans;
double oneWeight, totalWeight;

第一個宣告是說numberOfBeans這個variable持有int的特性,也就是整數的特性。int是integer(整數)的縮寫,也是一個能針對後面的名詞賦予整數特性的一種type(primitive type)(基本形態)。而第二個宣告講的是,oneWeight以及totalWeight是擁有double特性的variable,也就是它們是帶有小數的數值。從第二個例子中可以看到,如果一個宣告內有兩個variable以上,這些variable需要用逗號去隔開。而在宣告時需要特別注意的是,他們一樣要用分號做結尾才跳下一行。

Variable在程式裡宣告的位置很彈性,只要是在使用前任何的位置都可以。不過當然,variable宣告的位置最好是在程式易於閱讀的範疇之下考慮,因此,習慣上我們在要使用variable的前一行定義它,或是在代碼塊(程式主體部分)最一開始的時候定義。

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月25日 星期日

Java 學習日誌 015:Keyword


有一種特殊的identifier叫做keyword或reserved word。是已經被定義過的名詞,這些名詞就無法再被用來作為variable、class、method等的名稱。以下列出的是Java裡所有的keyword。



























有些名詞,例如之前提過的System、println等,並不是keyword,不過也是已經被定義過的名詞,它們與keyword的不同點是它們可以在被重新定義。但是如果以不同的定義來用這些名詞,很容易造成混淆與錯誤,因此,最好還是把它們當做keyword來對待。

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月24日 星期六

Java 學習日誌 014:Identifier


之前我們提過variable(變數),不過還沒解釋如何命名一個variable。要命名一個variable首先要知道的是,variable的名稱是一種identifier(識別字),什麼是identifier呢?Identifier是在寫程式的過程中那些需要自行定義的名稱,所以除了variable之外,還有我們之前提到的class(類別)和method(方法)等,它們的名稱都是identifier。

Identifier基本上只會由三種東西組成,即字母、數字,以及底線符號(_)組成($是除了底線以外會用到的符號,不過只會在特殊情況下使用),並且不能以數字為開頭,舉例來說,以下這行列出的都是有效的identifier。

x   x1   x_1   _abc   ABC123z7   sum   RATE   count   data2   bigBonus

雖然以上列出的名稱都是能被compiler所接受的,但是前五個名稱對於identifier沒有提示或明確的描述,因此沒有後五個來的好。而以下列出的identifier則無法被compiler接納使用。

12   3X   %change   data-1   myfirst.java   PROG.CLASS

上列這串名稱中,前兩個由於以數字開頭所以不被接受,而後面四個則是由於包含了除了字母、數字,以及底線以外的符號,因此也無法用為identifier。

Java是一種能區別大小寫的語言,因此下列三種以相同字母但不同大小寫組成的identifier,可以分別用為三種不同variable的名稱。

rate   RATE   Rate

但是如果在一個程式內用這麼相近的名稱其實也會很容易混淆,而且Java在identifier的命名上有一個不成文的法則,即是第一個字母通常為小寫,並以一個大寫字母來區別一個名稱裡的不同單字,例如

topSpeed   bankRate1   bankRate2   timeOfArrival

在identifier的長度方面,則並沒有限制,compiler甚至能接受一些長的不合理的名稱。

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月23日 星期五

Java 學習日誌 013:程式中的錯誤


瞭解如何寫基本的程式以後,接下來要知道的是,在寫程式時,有時候不小心會出現錯誤,這種錯誤我們稱它為bug,因此除錯的動作也就稱為debugging。而最常見的三種錯誤,為syntax errors、run-time errors,以及logic errors。以下是這三種錯誤的解釋。

一個syntax error指的是句法(或語法、文法、句構)上的錯誤,也就是說在文字、符號的排列、規劃上出現了錯誤,例如說遺漏了一個必須的符號,那就是syntax error。而當犯了syntax error的時候,compiler可以自動偵測出來,並且會列出一條訊息告知你,甚至會跟你說它認為錯誤的地方在哪、出了什麼錯。如果compiler跟你說你犯了一個syntax error,那不用懷疑的一定是犯了這個錯誤,但它說的位置與犯的錯是什麼則不一定都是正確的。

如果一個錯誤是在運算的時候才被偵測出來,那就是run-time error。假如電腦偵測出一個run-time error,則會顯示出一個錯誤的訊息,這個錯誤訊息可能沒有那麼好被理解,但至少它讓你知道程式裡有錯誤。

一個錯誤發生在合理可運行的情況下,則稱為logic error。如果你的程式裡有logic error,他會被成功編譯、運算,並且不會出現任何錯誤的訊息。意思就是說你寫了一段有效的程式,只不過結果並不是你要的。舉例來說,做數學運算時,把加號不小心用成乘號,那就是一個logic error。Logic error是最難被找出來的,因為電腦並不會給你任何偵測到錯誤的訊息。

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月22日 星期四

Java 學習日誌 012:撰寫並執行Java程式 方法三


撰寫並執行Java程式的第三種方法,是利用NetBeans IDE(Integrated Development Environment),要使用NetBeans IDE也是請先到官方網站下載並安裝。

安裝完以後打開NetBeans IDE,從File裡面選擇New Project,如下圖所示































接著在Categories選擇Java,在Projects選擇Java Application後,按下Next































輸入Project Name並選擇要儲存的位置後,按下Finish































一個預設頁面就會跳出,並且已經幫你定義好class與main































由於class與main都已經定義好了,所以直接在「TODO code application logic here」下方輸入主要的程式內容,如下圖所示































輸入好後在上方工具欄裡有一個綠色的箭頭,代表著運算程式(Run Project)































按下綠色箭頭後,下方Output的欄位就會顯示運算後的結果































參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月20日 星期二

Java 學習日誌 011:撰寫並執行Java程式 方法二


撰寫並執行Java程式的第二種方法,是利用TextPad,要用TextPad請先到官方網站下載並安裝。

安裝好後打開TextPad,直接輸入程式如下圖所示



























接下來一樣必須要將其檔名儲存為FirstProgram.java,存檔後你會發現程式裡的字顏色變了,其實這是因為TextPad能辨識程式裡的指令與字串



























存完檔案後就可以編譯程式了,從工具列裡的Tools找到External Tools,裡面就有能編譯程式的指令Compile Java(或直接Ctrl+1)



























點選Compile Java後,底下的Tool Output會顯示「Tool compiled successfully」,代表程式已經編譯完成



























編譯完成的程式就能開始執行了,要執行此程式,可以從工具列裡Tools裡面的External Tools找到Run Java Application指令



























點選此指令後,就會跳出程式運算後的結果,如下圖所示



























參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月19日 星期一

Java 學習日誌 010:撰寫並執行Java程式 方法一


要撰寫並執行Java程式的方法有好幾種,這裡介紹其中的三種。第一種方法是利用純文字編輯器(如Windows的記事本)與命令提示字元。

如上一章提到的,一個Java程式是由一個以上的class所組成,所以要運算這段程式,必須先要編譯這些class。而這些class的定義(檔案)的名稱也必須和class的名稱相同,只不過要再加上「.java」為副檔名。

我們若以之前的例子為例,先開啟記事本,並且輸入以下資訊

public class FirstProgram
{
 public static void main(String[] args)
 {
  System.out.println("Hello reader.");
  System.out.println("Welcome to Java.");
  System.out.println("Let's demonstrate a simple calculation.");
  int answer;
  answer = 2 + 2;
  System.out.println("2 plus 2 is" + answer);
 }
}

然後將此檔案儲存為「FirstProgram.java

接下來若要編譯與運算這個程式,要先到Java的官方網站下載Java Development Kit(JDK),如何下載JDK呢?電腦不難 有完整的下載安裝流程可以參考

下載並安裝好JDK後,就可以利用命令提示字元來編譯並且運算程式。(接下來請對照本章最下方圖示)打開命令提示字元,輸入「cd」(進入到某個目錄裡的指令)後貼上Java程式所在的位置的路徑,按下Enter後它就會進入Java程式所在的目錄裡。

進入檔案所在的目錄後,就能開始針對此檔案編譯與運算了,首先,要編譯此程式,輸入

javac FirstProgram.java

javac意指Java compiler,就是Java編譯器,接著輸入要編譯的檔案名稱(與副檔名)按下Enter後檔案就被編譯了,若程式沒有問題,則命令提示字元不會顯示任何資訊,不過編譯過後的檔案會自動儲存在與原本Java程式相同的資料夾裡並且有著「.class」的副檔名(以此例為FirstProgram.class)。

接下來要運算此編譯過後的程式,在命令提示字元內輸入

java FirstProgram

java是運算Java程式的指令,後面加上class的名稱(不需要再輸入任何副檔名),按下Enter後就會開始運算並且跑出以下的字串

Hello reader.
Welcome to Java.
Let's demonstrate a simple calculation.
2 plus 2 is 4

以上在命令提示字元內操作的過程結果如下圖所示



參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月18日 星期日

Java 學習日誌 009:Class Loader


一段Java程式,是由好幾個class組成的,通常這些class的定義也分別在不同的檔案裡,並且是分開被編譯的。為了要能夠執行程式,這些classe各自被編譯後的byte-code必須要再連接在一起,而這個用來連接的程式則稱為class loader(類別載入器),不過不用擔心,這個動作通常是自動完成的。

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月17日 星期六

Java 學習日誌 008:更清楚地解釋Java程式語言的邏輯


當我們編譯並執行一個Java程式的時候,根本很難知道其實你的程式是被翻譯成byte-code,而不是machine language。我們通常下達兩個指令,一個是compile(編譯/翻譯)程式(變成byte-code),而另一個是run(執行/跑)程式。而執行程式的這個指令也就讓JVM開始編譯byte-code。

當我們用編譯器的時候,一些名詞有時候會讓人很困惑,譬如說,要輸入compiler的程式,與compiler輸出的程式,都叫做程式(program)。為了讓人清楚知道我們所提的是哪個程式,我們稱輸入compiler的程式(以現在的例子來說就是Java program)為source program,或source code;而稱被翻譯出來的low-level language為object program,或object code。而code這個詞謹代表一段程式或部分的程式。

因此,更清楚地圖解「Java程式語言的由來與邏輯」,會如下圖所示














參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月16日 星期五

Java 學習日誌 007:Byte-Code與Java Virtual Machine


上個文章講到JVM,Java Virtual Machine,一種虛擬電腦用來翻譯byte-code成各種特定電腦能讀取的machine language。而JVM翻譯byte-code的方式有兩種,一種是透過interpreter(解釋器,又譯為直譯器),令一種是透過Just-In-Time(JIT)compiler(及時編譯器)。

一個interpreter會同時翻譯byte-code並且執行翻譯後的machine language指令,所以是一段一段的翻譯並且執行,並非翻譯一整個byte-code程式再執行,所以稱為直譯器(直接一段一段的翻譯執行)。

當今JVM的執行,採用的是JIT compiler,JIT compiler是一種直譯器與編輯器的綜合體,它一次會翻譯一大段的byte-code成當地電腦的machine language,這些被翻譯過的machine language還會被記得,以利下次使用,所以所有的byte-code只需要被翻譯一次,翻譯的速度就比interpreter快很多。

當跑一段Java程式的時候,首先,用compiler將其翻譯成byte-code,接著用JVM為你的電腦翻譯byte-code成適用的machine language,然後你的電腦才能執行這段machine language的指令。

這聽起來像byte-code是多出來的一道程序,為何不直接用一個compiler翻譯程式成特定電腦的machine language?這樣的方法是其他大多數程式語言所使用的,然而,Java byte-code讓Java程式非常易於攜帶,當你將Java程式翻譯成byte-code後,你可以在任何電腦上使用這段byte-code,所以就能將byte-code透過網路傳送到另一台電腦並執行,這也就是為什麼Java適用于網路應用程式撰寫的原因之一。而且這個方式讓執行程式更為安全,若一段Java程式執行異常,那它只會在JVM的環境下異常,而不會造成當地機器(native machine)的危害。不過當然,每一台電腦都要有自己的程式去執行Java Virtual Machine。

將這些觀念套用在「Java程式語言的由來與邏輯」圖示上,就會如下圖所示






參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月15日 星期四

Java 學習日誌 006:Byte-Code與Java Virtual Machine


大多數的程式語言被設計為讓人類(相對)易於撰寫與閱讀。這些語言被稱為high-level landuage(高階語言);而那些能直接能被電腦所瞭解的語言,稱之為machine language(機械語言)。Machine language或是類似machine language的語言就被稱為low-level language(低階語言)。一段以high-level language撰寫的程式語言,像是Java,必須要被翻譯成machine language之後,才能被運算。這個翻譯的程式就是我們之前提到的compiler(編譯器),而這個翻譯的過程就被稱為compiling(編譯)。

大多數程式語言的共同缺點是,他們的compiler直接翻譯high-level langusge成machine language,但是由於不同的電腦需要不同的machine language,所以就需要不同的compiler去為不同的電腦翻譯,而Java則採用了一種稍微不同的方式、一種更為通用的方式。

儘管某些版本的Java可以為特定的電腦直接翻譯你的程式為machine language,但最原始的與現今大多數的Java compiler則不這麼做,而是將你的Java程式翻譯成我們之前有提到的byte-code。Byte-code並不是專給某類電腦讀取的machine language,而是給一種稱為Java Virtual Machine(JVM)的虛擬電腦所讀取。 Java Virtual Machine與典型的電腦很相似,因此,能輕易地將一個以byte-code撰寫的程式翻譯為任何特定電腦能讀取的machine language。

我們把之前圖解過的「Java程式語言的由來與邏輯」再解釋的更詳細些,就會如下圖所示

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月14日 星期三

Java 學習日誌 005:一段簡單的Java Application Program的意思

 1 public class FirstProgram
 2 {
 3  public static void main(String[] args)
 4  {
 5   System.out.println("Hello reader.");
 6   System.out.println("Welcome to Java.");
 7   System.out.println("Let's demonstrate a simple calculation.");
 8   int answer;
 9   answer = 2 + 2;
10   System.out.println("2 plus 2 is" + answer);
11  }
12 }

上面為一段Java程式,若你跑這段程式,則你的螢幕上會顯示以下資訊

Hello reader.
Welcome to Java.
Let's demonstrate a simple calculation.
2 plus 2 is 4

                                                                                                                                                                   

延續上次的文章,Java中能定義variable(變數)的東西有兩種,一種是primitive type(基本形態),另一種是reference(參考),其詳細的解釋之後會再說明,而程式第八行中的int,是primitive type(簡稱type)的其中一種。而type,形態,由字面上的意思我們可以想像,其功能為賦予在他之後的東西某種形態,而int這個type的功能是賦予在他後面的東西為整數(integers)的形態(能賦予整數形態的type不只有int,之後會再詳細列出)。因此我們可以知道以下這行程式

int answer;

它的意思為answer是一個變數,而且是一個整數的變數(可以變換、非固定的)。

而接下來的這行程式其實才是第一行真正由電腦運算的程式

answer = 2 + 2;

在Java中,等號(=)是一種指派運算子(assignment operator),用來指派在這個指派運算子左邊的東西所擁有的價值,以上列這行程式為例,他並不是在敘述answer等於2+2這件事,相反的,這個等號是一個指令,讓電腦指派answer的價值等於2+2。

而最後一行

System.out.println("2 plus 2 is" + answer);

這個式子跟我們之前遇到的式子幾乎一樣,只不過稍微有點不同,這行式子中,字串"2 plus 2 is"接著一個加號(+),然後再接著answer,在這樣的情況下(小括號內、引號外),加號是一個運算子,它的功能是串聯在它前後的兩段字串,然而,變數answer並不是一個字串,不過當在加號的一端是字串的時候,它則會將另一端譬如說answer的值4轉換為一個字串,所以answer就會變成字串"4"。因此,這段式子也就等於

System.out.println("2 plus 2 is" + "4");

所以,以上列式子為例,雖然小括號內的內容是要顯示在螢幕上的資訊,不過並不是完全依照這個內容一模一樣的顯示,因為裡面可以有運算子,可以有變數,而這些都會在引號外,引號內的內容,才是那個會被一模一樣顯示出來的資訊。

而最後的兩個大括號是用來結束定義的,第一個大括號結束method main的定義,而第二個則是結束名為FirstProgram的這個class的定義。

這些,大約就是這段程式的意思了。

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月13日 星期二

Java 學習日誌 004:一段簡單的Java Application Program的意思

 1 public class FirstProgram
 2 {
 3  public static void main(String[] args)
 4  {
 5   System.out.println("Hello reader.");
 6   System.out.println("Welcome to Java.");
 7   System.out.println("Let's demonstrate a simple calculation.");
 8   int answer;
 9   answer = 2 + 2;
10   System.out.println("2 plus 2 is" + answer);
11  }
12 }

上面為一段Java程式,若你跑這段程式,則你的螢幕上會顯示以下資訊

Hello reader.
Welcome to Java.
Let's demonstrate a simple calculation.
2 plus 2 is 4

                                                                                                                                                                   

延續上次的文章,接下來以下的兩行,為這段程式的第一個動作

System.out.println("Hello reader.");
System.out.println("Welcome to Java.");

這兩行都由System.out.println為開頭,而其代表的動作是將小括號內的內容顯示在螢幕上,例如

System.out.println("Hello reader.");

會讓電腦在螢幕上顯示

Hello reader.

而接下來的指令已經換行了,因此其結果也會換行,所以,這兩行程式會讓螢幕顯示出

Hello reader.
Welcome to Java.

System.out.println是其中一種讓電腦輸出任何在小括號內的內容的指令,為什麼要這麼寫呢?之前我們說過Java程式是由擁有各種action(動作)的object(物件)組成,而這些action又稱為method。因此,System.out是一個用來傳送訊息到螢幕的物件(若是以之前的例子來說,他就是那台模擬飛機),而println是method,也就是顯示小括號內容在螢幕上的這個動作(以之前的例子來講,就是飛行這個動作)。當一個object執行名為method的動作的時候,我們稱之為invoking(喚起,或是calling)the method。所以在Java裡,要喚起一個method(動作)的時候,我們會先輸入object,然後輸入一個英文句號(.),接著是method的名稱,然後是一些小括號與其涵蓋的內容,而這些括號內的內容,我們稱為argument(參數),是要讓method執行它的動作的時候一些必要的資訊。所以,println是一個顯示訊息到螢幕的動作,而小括號內的argument,就是螢幕上要顯示的內容。需要注意的是,在宣告完main的定義之後的代碼塊(block)(程式內容主體的部分),皆需要以一個分號(;)作為結尾才跳下一行。

待續...

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月12日 星期一

Java 學習日誌 003:一段簡單的Java Application Program的意思


 1 public class FirstProgram
 2 {
 3  public static void main(String[] args)
 4  {
 5   System.out.println("Hello reader.");
 6   System.out.println("Welcome to Java.");
 7   System.out.println("Let's demonstrate a simple calculation.");
 8   int answer;
 9   answer = 2 + 2;
10   System.out.println("2 plus 2 is" + answer);
11  }
12 }

上面為一段Java程式,若你跑這段程式,則你的螢幕上會顯示以下資訊

Hello reader.
Welcome to Java.
Let's demonstrate a simple calculation.
2 plus 2 is 4

                                                                                                                                                                   

要解釋這段程式的意思,首先,由之前學習到的,一段Java程式是個擁有一個叫main的method(動作)的class,所以以下這兩行所說的,是這個程式是一個叫做FirstProgram的class,而 { } 內則涵蓋著其內容主體

public class FirstProgram
{

而接下來的兩行,則解釋了這段程式的main的定義

public static void main(String[] args)
{

若先不管一些名詞稱謂例如public, static, void等等,你可以先很簡單的視以下這四行的意思為,執行名為FirstProgram的程式

public class FirstProgram
{
 public static void main(String[] args)
 {

待續...

參考資料:Walter Savitch. Absolute Java. 5th ed.

2015年10月11日 星期日

Java 學習日誌 002:Objects與Methods


Java是一種object-oriented programming(物件導向程式設計)語言,簡稱OOP。為什麼稱為OOP呢?這個世界是由各種object(物件)組成,例如人、樹、房子、飛機等,而每種物件都有自己的action(動作),而這些action某種程度上也會影響世界上其他的object,因此,OOP指的是一種程式撰寫方法,這種撰寫方法視一段程式由許多的object所組成,而這些object會因為各自所擁有的action而與其他object互動。

在object-oriented programming中,有其專屬的稱謂名詞,上述所提到的objest,在OOP中就是稱為objects,而object所擁有與其他object互動的action則稱為methods。而同一種類的object擁有相同的type(類型),或更精確地說,他們在相同的class裏面。例如,在飛行模擬程式中,所有的模擬飛機都在相同的class裏面,或許就被稱為Airplane class,而所有在同一個class裡的objects,擁有相同的methods(也就是actions,或動作),例如起飛、飛到某一地點、降落等等。然而每架模擬飛機可以是不同的,利用賦予他們不同的data(資訊),他們可以擁有不同的特質。舉例來說,賦予每架飛機的data可以是兩組數字,分別代表各自的飛行速度與高度。

而一個Java application program,是一個擁有稱為
main的method的class,所以當你跑一個Java程式的時候,run-time system(運行時間系統,也稱為runtime environment(執行環境),指一種把半編譯的執行碼在目標機器上執行的環境)會自動喚起叫main的method(action)。



參考資料:Walter Savitch. Absolute Java. 5th ed.


2015年10月10日 星期六

Java 學習日誌 001:Java程式語言的由來與邏輯


Java程式語言的開發,最初其實是為了控制家電,如電視、洗衣機等。讓它們能夠瞭解並執行人們想要它們執行的動作。而我們知道家電之所以會動作,是因為裡面有computer processors(晶片)在控制,所以當你要一台洗衣機開始洗衣服然後再幫你烘乾衣服,這樣一段人類才懂的語言(指令),必須經過compiler(編譯程式)翻譯成computer processor懂的語言(machine language),但是由於各種家電由各種不同的computer processor去控制,因此也需要對應的各種不同的compiler去幫它翻譯,再加上家電並非都是非常貴重的產品,家電廠商們不想每次都花很多的金錢去開發複雜的compiler,因此,為了讓撰寫compiler能簡單些,程式語言的翻譯採取了兩段式翻譯的方法。

而兩段式翻譯法,是說一段指令(program),會先被翻譯成intermediate language(中間語言),這個intermediate language是一種各類家電都能夠讀取的通用語言,然後經由一段短的、易於撰寫的(所以也就便宜的)編譯程式(compiler)去翻譯成各種家電懂的語言(machine language)。而這個intermediate language也就是所謂的Java byte-code,也稱為byte-code。爾後,Java byte-code慢慢的就演進成現在被廣泛使用的程式語言。


而byte-code之所以稱為byte-code,是因為code通指一段程式或部分的程式,而byte(位元組)是電腦最小的儲存單位(1 byte = 8 bits),電腦能讀的資訊都是由byte組織而來,所以byte-code意味著一段電腦能讀懂的程式。

參考資料:Walter Savitch. Absolute Java. 5th ed.