Java 包的明显层次结构

Java 包的明显层次结构,java,packages,Java,Packages,在这个岗位上 “包的明显层次结构”一段中写道: “”起初,包看起来是分层的,但实际上不是。例如,Java API包括Java.awt包、Java.awt.color包、Java.awt.font包以及许多以Java.awt开头的其他包。但是,java.awt包中不包括java.awt.color包、java.awt.font包和其他java.awt.xxxx包。“” 但是如果我取消了rt.jar,我会发现java.awt.color和java.awt.font映射在一个 分层方式:java/aw

在这个岗位上

“包的明显层次结构”一段中写道:

“”起初,包看起来是分层的,但实际上不是。例如,Java API包括Java.awt包、Java.awt.color包、Java.awt.font包以及许多以Java.awt开头的其他包。但是,java.awt包中不包括java.awt.color包、java.awt.font包和其他java.awt.xxxx包。“”

但是如果我取消了rt.jar,我会发现java.awt.color和java.awt.font映射在一个 分层方式:java/awt/color和java/awt/font那么我理解的不好还是在那篇文章中有错误

但是,是否可以创建不分层的包?与物理包结构不匹配的逻辑包名称?

文章继续

导入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中的一个文件夹。这非常实用,否则我们需要在包名称空间和文件系统中类的物理位置之间进行映射。现在我们可以从包名称空间确定位置。这给人的印象是,这种层次结构也适用于包名称空间

但事实并非如此。这就是教程想要说的


(谢谢你的提问,我在思考答案的时候学到了很多,也理解了很多;)

本教程的意思是Java中没有子包的概念。包可能物理上位于文件系统的子文件夹中,但这并不意味着它将被自动包含(请参阅)


它也不授予高级包中的类访问包私有(默认范围)类的权限,如果存在包层次结构,您可能会想到这一点。

命名方案是层次结构,以及jar文件的内容


但是,java.awt和java.awt.color之间没有连接,也就是说,如果您在package foo中将一个类声明为package private(没有修饰符),则可以从foo访问它,但不能从foo.bar访问它。

您参考的文章将在下一段中解释这一点。包的名称用于表示与程序员眼睛的关系,但在编译器眼睛中没有任何关系。正如本文所解释的,导入
java.awt.*
不会导入
java.awt.font
中的任何类,它们是完全独立的包,在编程语言中没有任何层次关系。要导入
java.awt.font
中的所有类,您必须导入
java.awt.font.*
,而这不会导入父包
java.awt
或兄弟包(如
java.awt.color
中的任何类

因此,尽管与程序员之间存在明显的层次关系,但在语言中并没有任何层次关系。要访问给定包中的类,必须从它们的确切包中导入它们


如果包实际上是层次结构,那么人们可能会认为情况就是这样。然而,层次结构只是用来组织代码,并向程序员提示一组给定的包是要一起使用的。

将层次结构想象成一个文件系统。在Java中,包类似于目录,类类似于文件。包意味着包含一组相关的类。当存在逻辑上相关的包组时,可以对它们进行命名,使其显示为更大层次结构的成员。看看上面的java.awt.*示例,我可以将awt的类放在jar1中。其结构如下:

jar-1
   \-java
       \-awt
在awt目录中,您将找到声明自己是包java.awt成员的类和接口

现在我想为awt实现一些字体,但我将它们放在一个单独的jar中:

jar-2
  \-java
     \-awt
         \-fonts
字体目录是我为awt创建的字体的类和接口所在的位置

当您使用AWT和我的字体编程时,首先必须在类路径中同时包含jar-1和jar-2。当您要包含这些类时,您不会得到任何关于编译器在哪个jar中找到它们的反馈

//this loads all classes in the java.awt directory 
//  which happen to come from jar-1
include java.awt.*  
如果你想要字体

//Load all classes in the java.awt.fonts directory
//  which happen to come from jar-2
include java.awt.fonts.*
对于编译器和运行时来说,层次结构就像一棵大树。这并不意味着所有类都物理上驻留在同一个地方。话虽如此,我必须指出两点;1) 不建议将同一层次结构中的包分离到不同的jar中,因为这会让人感到困惑和维护上的麻烦,并且2)将包声明为其他人包结构的扩展是非常糟糕的