附:Java 入門與加深 FAQ
1. 什麼是 Java、Java2、JDK?版本號 1.3、1.4.2 怎麼回事?
答:Java 是通用、並發、強類型、面向對象編程語言(摘自 Java 規範二版)。JDK 是 Sun 分發的免費 Java 開發工具,正式名稱 J2SDK。
2. 什麼是 JRE/J2RE?
答:J2RE 是 Java 2 Runtime Environment,即 Java 執行環境。只需運行 Java 程式或 Applet 裝它即可;自行開發請裝 JDK(JDK 內含 J2RE)。注意:因 Microsoft 對 Java 支援不全,請勿用 IE 內建虛擬機運行 Applet,務必裝 J2RE 或 JDK。
3. 學習 Java 用什麼工具好?
答:建議先用 JDK + 文字編輯器,助理解 path、classpath、package 及 javac、java 基本命令。並下載與 JDK 版本一致的 API 幫助。不確定類/函數用法請先查 API 再發問。熟悉後可換 IDE。推薦 Eclipse(免費,官網),JCreator 功能較弱。
4. 學習 Java 有哪些好參考書?
答:首推 Thinking in Java (《Java 編程思想》),有中文版,第一章介紹面向對象編程思想,新手必讀。O'Reilly 與 Wrox 書籍也不錯。個人不喜歡大陸作者書。英文雖難但網上資料多為英文,API 也是英文。
5. Java 和 C++ 哪個更好?
答:問題不當。應問:哪個更適合我的專案?不需跨平台、分散式、極致追求執行速度 → C++ 適合。反之考慮 Java。
6. 什麼是 J2SE/J2EE/J2ME?
答:J2SE 即一般 Java。J2ME 針對嵌入式設備(如 Java 手機),有獨立 SDK。J2EE 使用 J2SE SDK,規範多針對伺服器要求與開發者約束。詳見後續 "J2EE FAQ"。
7. 第一個 Java 程式如何編譯/運行?
答:存為 xxx.java,DOS 下 javac xxx.java 產生 xxx.class,再 java xxx 運行。
8. 提示 "javac 不是內部或外部命令"?
答:path 問題。OS 在 path 範圍找不到 javac.exe。設環境變數:新增 JAVA_HOME 指向 JDK 安裝目錄,編輯 Path 加入 %JAVA_HOME%\bin。關閉重開 DOS 視窗即可。
9. 環境變數怎麼設?
答:請諮詢身邊會設定的人。
10. javac 通過但 java xxx 提示 NoClassDefFoundError?
答:classpath 問題。java 命令在 classpath 範圍找不到 class 檔。確認未誤打 java xxx.class。實際不需設 classpath,但若設了卻未包含 . (當前目錄) 會出此錯。在 CLASSPATH 加入 . 或刪除該變數。若用非 JDK 標準包 (如 javax.servlet.*) 也會出錯,請將對應 jar 加入 classpath。若源檔定義了 package 請參見 15。
11. 執行時提示 NoSuchMethodError: main?
答:每個 java 檔有且只能有一個 public 類,類名與檔名大小寫完全一致。運行類中有且只能有一個 public static void main(String[] args) 方法。
12. package 是什麼?怎麼用?
答:為唯一標識類別並分組。每類有全名(如 java.lang.String),java.lang 為包名。若你也定義 String,放入 mypackage,用全名 mypackage.String 與 java.lang.String 區分。邏輯相關類放同一包結構更清晰。源檔開頭加 package mypackage;。注意包無嵌套包含關係,A 包與 A.B 包對 java 命令是並列兩個包。
13. 未聲明 package 怎麼樣?
答:類別被視為在預設包中,全名與短名一致。
14. 類別中如何使用其他類?
答:用 java.lang 套件類無需處理。用其他套件類用 import package1.class1; 或 import package2.*; (.* 表示引入該套件所有類)。程式中可用短名。短名衝突用全名區分。
15. 用了 package 出現 NoClassDefFoundError,去掉 package 卻正常?
答:依包名存放 java 檔。工作目錄 /work,類 package1.class1 → 存為 /work/package1/class1.java。無包則放 /work。在 /work 執行 javac package1/class1.java 再 java package1.class1 即正常。此時可考慮開始用 IDE。
16. 想把 java 編譯成 exe 檔怎麼做?
答:JDK 僅編譯為 class 檔(跨平台位元碼),需靠平台相關 JRE 運行。Java 以此實現跨平台。某些工具可編譯為 exe,但作者反對(喪失跨平台性)。確信只在 Windows 運行可考慮 C++/C#。
17. 編譯提示 deprecated API 是什麼?
答:指已過時但為向前相容保留的方法,未來可能移除。應改用較新方法。API 通常說明替代方案。
18. 如何給 java 程式加啟動參數?
答:記得 public static void main(String[] args) 嗎?args 即啟動參數。運行 java package1.class1 -arg1 -arg2,args 含兩字串 arg1、arg2。
19. 從鍵盤輸入 int/double/字串?
答:Java I/O 比 C++ 複雜。範例:
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
String s = cin.readLine(); 取得字串。需數字再轉:int n = Integer.parseInt(s); 或 double d = Double.parseDouble(s);
20. 輸出 int/double/字串?
答:程式開頭 PrintWriter cout = new PrintWriter(System.out); 需時 cout.print(n); 或 cout.println("hello") 等。
21. 書上直接用 System.in/out 更簡單?
答:Java 用 Unicode 雙字節,System.in/out 是單字節 stream。需輸入輸出雙字節文字 (如中文) 請用作者做法。
22. 從檔案輸入?
答:類似鍵盤輸入,換成 BufferedReader fin = new BufferedReader(new FileReader("myFileName"));、PrintWriter fout = new PrintWriter(new FileWriter("myFileName"));。請下載 API 閱讀 java.io 套件。
23. 讀寫檔案指定位置?
答:java.io.RandomAccessFile 滿足需求。
24. 判定檔案讀完?
答:Reader.read() 回傳 -1 表示流結尾。
(原文後續內容省略)