有學習過 C 或 C++ 的人,在初學 Java 的時候,常常會將 Java 的 import 指令和 C++ 中的 #include 指令互相搞混,反倒是沒程式基礎的人來學習 Java 時不容易產生這樣的問題。這或許可以算是「從前的經驗造成學習上的誤解」的例子。C++ 在連結編譯的時候,會依照 #include 所指定的標頭檔而將相關的檔案連結起來,最後成為一執行檔。而所有 include 進來的 .h 檔案,可以直接使用其中所定義好的函式。如果我們 include 了一堆檔案,難免會有重複的函式名稱,所以後來 C++ 也加入了命名空間 namespace 的概念,以降低多重定義所帶來的影響:上述例子中可以看到,string 和 vector 兩種資料型別原本是 c++ 所沒有提供的,但是在我們 include 相關標頭檔後,我們就可以「直接」在程式區塊中使用它們。Java 中的 import 和 C++ 的 include 是不一樣的。import 主要的意思是告訴編譯器,程式所需要的類別,在那一個命名空間底下。不像 C++ 的是,C++ 是會把相關的二進位程式碼加入我們的程式碼中,所以我們 include 的檔案愈多,那麼程式就可能愈肥大;Java 的做法是只單純的指定出命名空間 (實際上會對應到目錄),編譯時會檢查其指定的類別是否存在。等到執行時,再依照 import 所指定的命名空間去載入所需的類別。
Java 中的靜態載入
我們在使用 Math 類別中的靜態方法時,需要撰寫 Math.min(a, b) 這樣的敘述句,而不像 C++ 中可以直接呼叫 min(a, b)。當然這樣的好處是可以避免有許多同名方法時,會產生模擬兩可的情形發生。不過在新版中的靜態載入,允許我們直接使用靜態方法和欄位: