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

当您声明这样的导入时:

import com.microsoft.azure.storage.*; 

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

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

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

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

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

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

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

这些都有一个名称 – 按需导入类型 。

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

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

import java.util.* ;

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

那还包括/子目录中的所有内容吗? 包括这样的东西?

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