2010-03-05 42 views
2

如果我從其他包中導入並使用單個類,它是否會包含包中的所有文件?使用包中的單個文件是否包含所有文件?

例如,如果我只使用稱爲MyFunctions的mylibrary包中的一個類,下面是否包含所有類?

import my.example.mylibrary.*; 

則爲:

import my.example.mylibrary.MyFunctions; 
+1

你是什麼意思,「包括」?你的意思是,VM會在運行時加載所有這些類嗎?如果是這樣,我認爲答案是「否」,但是您可以在啓動類加載調試的情況下運行虛擬機並自行驗證。 – Pointy

+3

import!= include 您是否來自C/C++背景?如果是這樣,import可以看起來類似於include,但實際上它更類似於C++中的using子句。 – SteveD

回答

4

沒有

進口不包括任何東西到你的程序。

類在使用時加載,而不是在之前加載。所以import唯一的幫助你避免鍵入整個類名。

比如,它是更好的輸入(和閱讀):

import my.example.mylibrary.SomeClass; 
import java.util.List; 
import java.util.ArrayList; 
... 
SomeClass some = new SomeClass(); 
List<SomeClass> list = new ArrayList<SomeClass>(); 
list.add(some); 
etc.. 

// no import 
... 
my.example.mylibrary.SomeClass some = new my.example.mylibrary.SomeClass(); 
java.util.List<my.example.mylibrary.SomeClass> list = new java.util.ArrayList<my.example.mylibrary.SomeClass>(); 
list.add(some); 

然而,他們的表現完全一樣。

另外,請記住,使用

import some.packagename.*; 

import some.packagename.Each; 
import some.packagename.Single; 
import some.packagename.Class; 
import some.packagename.ByLine; 

具有完全相同的服務表現,除了杉杉它更快(髒),第二個更清晰。

總是!!use the second form in production and/or when someone else needs to see your code.

+1

我也認爲第二種方式也有助於類名的模糊性。 例如,在JDK 1.1中,沒有java.util.List類。考慮一個導入java.awt。*和java.util。*並使用名稱List作爲java.awt.List的縮寫形式的程序。該程序在JDK1.1下編譯時沒有錯誤,但無法在Java 2中編譯。 – Ascalonian

1

如果你特別導入MyFunctions,編譯器仍然不會知道MyOtherFunctions。 *版本將導入包中的所有內容。

+0

不錯,整潔,點... –

2

「include」是什麼意思?

兩者在性能上沒有差異。他們所做的唯一的事情是允許你一直寫MyFunctions而不是my.example.library.MyFunctions

當您第一次使用該類時,類加載器將(通常)加載.class文件。當.class位於.jar文件中時,可能會加載更多的文件。但是,這並不取決於你寫你的import的方式。

2

導入語句只是編譯器的一個指令,以幫助它解析對使用非限定類名稱的類的引用 - 沒有其他更多

例如,每類隱式進口java.lang.*,這意味着你可以參考String,而不是java.lang.StringInteger代替java.lang.Integer

如果你有mypackage.Amypackage.B,你import mypackage.A您可以在使用A但是您必須使用mypackage.B而不是B

使用*而不是特定的類名只是告訴編譯器允許包中的所有類而不是特定的類。因此,import mypackage.*允許您在代碼中使用AB

+0

+1 BTW,java.lang是唯一一個總是自動「導入」ed的軟件包。 – OscarRyz

相關問題