2009-10-12 58 views
15

在Java中,我們可以導入單個類以及整套類(一個包)。Java中的類導入和包導入之間的區別?

作爲示例

import java.util.* 

包括

import java.util.ArrayList; 
import java.util.Date; 
import java.util.Enumeration; 
import java.util.HashSet; 
import java.util.Hashtable; 
import java.util.List; 
import java.util.Iterator; 
import java.util.Map; 

除了碼的長度,是否有使用每一種方法以任何方式的任何特定優勢?內存分配?性能?

+0

我剛要問這個。謝謝! – 2012-09-19 06:25:58

回答

26

沒有性能或內存分配優勢 - 它們都會編譯爲相同的字節碼。

import聲明是告訴編譯器在哪裏找到源代碼所指的類。

但是,僅由類導入是有優勢的。如果在兩個包中有一個具有完全相同名稱的類,那麼將引用哪個類的衝突。

一個這樣的例子是java.awt.List類和java.util.List類。

假設我們想要使用java.awt.Paneljava.util.List。如果源進口包,如下所示:

import java.awt.*; 
import java.util.*; 

然後,參照List類將是ambigious:

List list; // Which "List" is this from? java.util? java.awt? 

但是,如果一個進口明確,那麼結果將是:

import java.awt.Panel; 
import java.util.List; 

List list; // No ambiguity here -- it refers to java.util.List. 
+1

好點。然後編譯器在編譯帶有List的代碼時報告編譯錯誤? – 2009-10-12 11:01:52

+0

是的,編譯器會告訴你一個錯誤,名字「List」是不明確的。 – Jesper 2009-10-12 11:03:21

+1

N.B.您仍然可以導入整個包,然後覆蓋各個類的導入。換句話說,您仍然可以導入java.awt。*,然後導入java.util.List。 – 2009-10-12 12:08:55

2

在應用程序的內存分配或性能方面完全沒有區別;導入語句在運行時對你的程序根本沒有任何影響。它們只是告訴編譯器在哪裏(在哪些包中)查找類的指令。

但是,最好避免通配符語法並始終使用特定的導入。這樣做可以避免與程序的未來版本兼容的問題。

假設您在程序中使用某個庫的版本1.0,並且您做了import somelibrary.*;。假設你的程序有一個名爲X的類。現在,庫的1.1版出來了,你想使用它。假設圖書館1.1版本中偶爾會有一個名爲X的新類。

如果您使用通配符語法,則突然從庫中導入X。編譯器會給你一個錯誤,因爲程序中已經有一個類X,編譯器無法區分你的庫中的XX

如果您只從庫中導入實際需要的類,那麼您不會遇到此問題,因爲您不會從庫的版本1.1自動導入X

6

您選擇使用的導入僅在解析類名時產生編譯時差異。

所以唯一的優點/缺點適用於可讀性。

只有導入最低要求似乎更好,因爲有人可以看看你實際使用的是什麼。也就是說,IDE可能會處理這個問題,這是一個有爭議的問題。

2

執行顯式導入在編譯時更安全,因爲不存在類衝突的可能性。例如

import java.sql.*; 
import java.util.*; 

導致一個問題,如果你想使用一個Date類(即從哪個包?)。

但除此之外,沒有性能或內存方面。這純粹是一個編譯時問題。

2

使用'*'導入的優點是它的代碼行少,輸入少。如果您使用「啞」文本編輯器而不是IDE來編寫代碼,而不是使用省略號隱藏導入並可以半自動添加導入,則這更爲重要。

使用進口的缺點「*」是:

  • 你得到導入的類名稱衝突偶爾;例如當某些類名用於不同包中的類時,並且導入它們。
  • 您無法通過查看導入來查看類顯式依賴關係。但是,如果您的IDE可以用其他方式顯示依賴關係,則這一點就不那麼重要了。
0

任何像樣的IDE都會爲您提供更多的導入語句。如果這對您是個問題,請獲得更好的IDE。

IntelliJ做到了; Eclipse也是如此。我自己不使用NetBeans,但我敢打賭它確實如此。

相關問題