在这篇文章中,http://java.sun.com/docs/books/tutorial/java/package/usepkgs.html
在“软件包的外观层次结构”这一段中写道:
"“起初,包看起来是分层的,但事实并非如此。例如,Java API包括一个java.awt包、一个java.awt.color包、一个java.awt.font包,以及许多其他以java.awt开头的包。但是,java.awt.color包、java.awt.font包和其他java.awt.xxxx包不包含在java.awt包中。"“
但是如果我解压rt.jar,我发现java.awt.color和java.awt.font是以一种分层的方式映射的: java/awt/color和java/awt/font,所以我是不是理解得不好,或者在这篇文章中有错误吗?
然而,是否有可能创建不分层次的包?逻辑包名称与物理包结构不匹配?
发布于 2009-11-19 23:37:15
你引用的文章在下一段中解释了这一点。包的名称用于指示程序员眼中的关系,但在编译器眼中没有任何关系。正如本文所解释的那样,导入java.awt.*
不会导入java.awt.font
中的任何类,它们是完全独立的包,在编程语言中没有任何层次关系。要导入java.awt.font
中的所有类,您必须导入java.awt.font.*
,而这不会导入父包java.awt
或java.awt.color
等同级包中的任何类。
因此,即使对程序员来说存在明显的层次关系,但在语言中实际上没有任何层次关系。要访问给定包中的类,您必须从其确切的包中导入它们。
如果包实际上是层次结构,那么人们可能会认为情况就是这样。然而,层次结构只是为了组织代码,并向程序员提供提示,即给定的一组包旨在一起使用。
发布于 2009-11-19 23:33:10
这篇文章继续
导入java.awt.*会导入java.awt包中的所有类型,但不会导入java.awt.color、java.awt.font或任何其他java.awt.xxxx包。
因此,它只描述了import语句的一般行为:import package.*
从package
导入所有类,但没有从子包导入类。
是的,类文件就在我们期望的rt.jar中,这只是关于在java源文件中导入类。
编辑
是的,教程它增加了一定程度的混乱。
尝试将包理解为共享公共命名空间的类的集合。java.awt
是一个名称空间,java.lang
和java.awt.color
是另一个名称空间。现在明白了,java.awt
和java.awt.color
名称空间是不相关的。java.awt.color
不是java.awt
的“子”命名空间。事实上,Java中并没有规定必须将某些类放在特定的“子”包中。如果有一个层次结构,我希望在接口的“子命名空间”中声明一些规则,比如实现。但是这里没有
是的,命名空间到文件系统的实际映射引入了一个文件夹层次结构,其中color是awt中的一个文件夹。这非常实用,否则我们需要在包名称空间和类在文件系统中的物理位置之间建立一个映射。现在我们可以从package名称空间中确定位置了。这给人的印象是,这种层次结构对于包命名空间也是正确的。
但事实并非如此。这就是本教程想要说的。
(谢谢你的问题,我在思考答案的过程中学到了很多,理解了很多;)
发布于 2009-11-19 23:36:31
本教程的意思是,Java中没有子包的概念。包可能实际位于文件系统中的子文件夹中,但这并不意味着它将自动包含在其中(请参阅Andreas' answer)。
它也没有为更高级别的包中的类提供访问包私有(默认作用域)类的权限,如果存在包层次结构,您可能会这样认为。
https://stackoverflow.com/questions/1764078
复制相似问题