網頁

2013年3月17日 星期日

Java Programming Introduction 01: HelloWorld


大部份的程式語言, 一開始都會來一個印出 "HelloWorld!" 的小程式, 來作為程式語言的第一個實例, 這邊也不例外. 不過, 我們的說明會多一些.
 

HelloWorld 的程式碼:

HelloWorld.java

// import java.lang.*;

public class HelloWorld {

     public static void main(String[] args) {

         System.out.println("Hello! World!");   
    }
}

編譯及執行


在命令列輸入編譯指令, 以生成 HelloWorld.class 的目的檔
javac HelloWorld.java

* 必須輸入 .java 的副檔名,否則會有
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested
這個奇怪的錯誤

在命令列輸入執行指令, 以執行 HelloWorld.class 的目的檔
java HelloWorld

* 不能帶有 .class 的副檔名,否則會有另外一個錯誤
Could not find or load main class HelloWorld.class
如果你用的是中文系統, java 還會幫忙把錯誤訊息翻譯成中文
錯誤: 找不到或無法載入主要類別 HelloWord.class
 

程式碼的逐行說明


// import java.lang.*;

1. 這是一行註解, java 的註解行以 // 開始, 表示整行都是註解
2. import 表示參考的其他的 class 或 package.
3. java.lang.* 表示 java.lang 這個 package及以下的 package, 及 class.

Package 及 Class
如前面程式中的 HelloWorld, 就是一個 class, 或稱為物件, 是物件導向程式設計的基本單位. 描述某一概念, 或某種型態.

package 則是一群 class 的集成. 以達到某些目的. 譬如說, java.io 這個 package, 就是提供一些 io 有關的 class, 以達到 input/output 的目的. 其中的 java.io.File 的 class, 則是檔案有關的 io 的具體實作.

Java 的 fully qualified name
Java 的 fully qualified name, 是一個分類的命名原則. 做為一個軟體工程的從業人員, 一想到分類, 就應該聯想到樹狀結構. 不管是目錄的結構, 網址, 等等. 同理, Java 也是用樹狀結構來組織這些類別. 譬如說, java.lang.String 這個 class, 從名字我們就可以知道, java 這個 package 裡面有一個 lang 的 package, lang 的 package 裡, 有一個 String 的 class. class 通常以大寫開始, package 則通常都是小寫.  

所有的 java 程式, 都需要 java.lang 這個 package 才能執形. 因為都需要, 所以不用去指定, 這一個 import 的指令, 實際是可以省略的. 它的作用只是用來說明 class 及 package.

public class HelloWorld {

1. Java 基本上是一個檔案, 一個 class. 它裡面可以再定義 subclass. 作為這個檔案中的主要 class, 它必須可以被外部存取到, 否則就沒有存在的意義. 因此, 它必須是 public.

2. class 是定義 class 的關鍵字.

3. class name 的名稱, 雖然沒有強制, 但是強烈建議以駝峰式命名. 也就是字首大寫, 其餘小寫, 複數名稱連寫. 如 HelloWorld 就是 Hello 和 World  這兩個字合起來, 字首分別用大寫. 目的其實很簡單, 讓程式好讀.

4. 大刮號在右邊. Java 強烈建議, 標示程式區塊啟始的左大刮號, 放在程式碼的最右邊, 標示程式區塊結束的右大括號, 則放在新一行的最左邊. 這一個問題從有 C 語言開始, 就開始爭論.目前看起來, Java 的開發人員, 是"大刮號在右邊"的支持者較佔優勢. 相對於 Microsoft 體系下, "大刮號在左邊" 的程式風格, 我是覺得見仁見智. 但是先把這個問題律定下來, 也算是好事一樁.

     public static void main(String[] args) {

1. 作為一個可以被系統直接執行的 class, 必須要有一個進入點. 也就是 main.
2. main 必須要可以被系統存取, 所以它必須是 public.
3. main必須要可以被系統呼叫, 所以它必須是 static.
4. 系統不需要它的回傳值, 所以回傳值是 void.
5. 和 c or c++ 一樣, 它可以攜帶參數. main 的參數, 是一個字串陣列.

          System.out.println("Hello! World!"); 

1. 這是呼叫 java.lang.System 這個 class 的 out 這個 成員的 println 的 方法
java.lang.System 這個 class, 裡面有一個 out 的 member:

static PrintStream out;

而 PrintStream 又有一個 println 的 method

void println( char[] x );

所以, 整個敘述, 可以翻譯成中文:

呼叫 java.lang 這個 package 的 System 的 class 中, 名稱為 out 的 PrintStream 的 class 的 println 的函式.

2. member & method
在物件導向的程式語言中, 通常會把包含在這個 class 中的變數稱為 member data, class 中的函式, 稱為 member method. 有時又簡稱 member data 為 member, member method 為 method.

3. System.out
System.out其實就是 C/C++ 環境下的標準輸出, stdout.
System.in 就是標準輸入 stdin.
System.err就是標準錯誤裝置 stderr.

 

 

沒有留言:

張貼留言

請提供您寶貴的意見