你的问题是措辞不当,因为如果你import pkg.*,你肯定被允许然后从包导入类pkg.B和pkg.C.也就是说,这样做非常好:
import pkg.*;
import pkg.B.*;
import pkg.C.*;
Run Code Online (Sandbox Code Playgroud)
但我假设你真正问的是为什么,如果import pkg.*它不自动导入在子包中声明的类型pkg.要回答这个问题,最好转向Java语言规范:
包的分层命名结构旨在方便以传统方式组织相关包,但除了禁止包含具有与顶级类型相同的简单名称的子包之外,它本身没有意义(第7.6节)在该包中声明.
例如,在名为的包
oliver和另一个名为的包oliver.twist之间,或者在名为evelyn.wood和的包之间没有特殊的访问关系evelyn.waugh.也就是说,命名包中的代码oliver.twist无法更好地访问包中声明的类型,而oliver不是任何其他包中的代码.
换句话说,当您import pkg.*导入由命名包中包含的编译单元定义的所有顶级类型时pkg,您没有导入任何子包pkg(例如pkg.B或pkg.C).
听起来你问为什么import java.awt.*不导入java.awt.color.*等等.
首先,包似乎是分层的,但它们不是.例如,Java API包括java.awt包,java.awt.color包,java.awt.font包以及许多以java.awt开头的包.但是,java.awt.color包中包含java.awt.color包,java.awt.font包和其他java.awt.xxxx包.前缀java.awt(Java抽象窗口工具包)用于许多相关的包,以使关系明显,但不显示包含.
更重要的是,
导入java.awt.*会导入java.awt包中的所有类型,但它不会导入java.awt.color,java.awt.font或任何其他java.awt.xxxx包.如果您计划使用java.awt.color中的类和其他类型以及java.awt中的类,则必须使用其所有文件导入这两个包:
Run Code Online (Sandbox Code Playgroud)import java.awt.*; import java.awt.color.*;