星型导入是否包含Java中的子包?

时间:2015-07-23 03:16:54

标签: java packages

当您声明这样的导入时:

import com.microsoft.azure.storage.*;

这是否包括其子包中的所有内容?例如,它包括这个吗?

import com.microsoft.azure.storage.blob.*

如果没有,为什么不呢? (编辑:"为什么"问题基本上是偏离主题。在考虑正确答案时忽略该位。)

4 个答案:

答案 0 :(得分:4)

不,不。它只导入包中的所有内容(即目录本身)。子目录被认为是不同的包,因此您需要:

import com.microsoft.azure.storage.*
import com.microsoft.azure.storage.blob.*

至于为什么语言设计师选择走这条路线,人们只能猜测,但他们决定采用的系统确实允许更精细的方法。

答案 1 :(得分:1)

是的,您可以从导入中导入所有类,但它无法导入具有相似名称的多个包。例如import java.util *;也不导入java.util.prefs或.jar你必须单独导入这些。我不知道这是否能回答你的问题,以及为什么我不确定这样做是否有意义。如果要导入具有相同静态变量的类似软件包,但只需要两个或三个软件包,则会出现错误或代码无法正常运行。

答案 2 :(得分:1)

这些名称为type import on demand

  

按需输入类型声明允许根据需要导入命名包或类型的所有可访问类型。

他们也只是导入包本身,而不是任何子包,正如示例所阐明的那样,强调我的:

  

import java.util.*;

     

使包java.util中声明的所有公共类型的简单名称在编译单元的类和接口声明中可用。因此,简单名称Vector引用编译单元中所有位置的包Vector中的类型java.util,其中该类型声明未被遮蔽(第6.4.1节)或模糊( §6.4.2)。

答案 3 :(得分:1)

  

是否包含/子目录中的所有内容?包含   这样的事情?

*代表包com.microsoft.azure.storage内的所有编译单元,其中子包实际上不是编译单元,因此在编写myPack.*时不会获取。编译单元包括classinterfaceenum等。