递归导入Java

递归导入Java,java,Java,我是Java开发的新手。我有一个关于Java中递归导入的快速问题 假设包“pkg”包含以下内容 甲级, B包(这又包含B1类) 包C(这又包含C1类) 如果我使用import-pkg.*为什么不允许我从包“B”和“C”导入类 我想了解Java不允许我进行递归导入的基本原理。如您在原始问题(编辑之前)中所述,导入没有任何限制 假设您具有以下层次结构: pkg1 A.java pkg1.pkg2 B.java pkg1.pkg3 C.java D.java 您可

我是Java开发的新手。我有一个关于Java中递归导入的快速问题

假设包“pkg”包含以下内容

  • 甲级,
  • B包(这又包含B1类)
  • 包C(这又包含C1类)
如果我使用
import-pkg.*
为什么不允许我从包“B”和“C”导入类


我想了解Java不允许我进行递归导入的基本原理。

如您在原始问题(编辑之前)中所述,导入没有任何限制

假设您具有以下层次结构:

pkg1
    A.java
pkg1.pkg2
    B.java
pkg1.pkg3
    C.java
    D.java
您可以导入A.java、B.java、C.java、D.java或其中的任意组合

import pkg1.A;
import pkg1.pkg2.B;
import pkg1.pkg3.C;
import pkg1.pkg3.D;
唯一需要注意的是,在类C中,您可以使用类D而不显式导入D,因为它们共享同一个包


但是,像
import pkg1.*
这样的总括语句将不会拉入位于包层次结构更底层的类;您还需要导入每个子包:
import pkg1.pkg2.
,等等。这就是语言的设计方式。

Java中的惯例是只导入所需的类。大多数IDE会自动为您组织它们。批量导入类不像在其他语言中那样常见。

听起来你在问为什么
导入java.awt.*
不导入
java.awt.color.*
等等

这是最好的解释,它说

起初,包看起来是分层的,但实际上并非如此。对于 例如,Java API包括一个Java.awt包,一个Java.awt.color 包,一个java.awt.font包,以及许多以 java.awt。但是,java.awt.color包 包和其他java.awt.xxxx包不包括在 java.awt包。前缀java.awt(java抽象窗口 工具箱)用于许多相关的包,以使 这种关系很明显,但没有表现出包容性

更重要的是,

导入java.awt.*导入java.awt包中的所有类型, 但它不导入java.awt.color、java.awt.font或任何其他文件 java.awt.xxxx包。如果您计划使用类和其他类型 在java.awt.color和java.awt中,必须同时导入这两个文件 包及其所有文件:

import java.awt.*;
import java.awt.color.*;

你的问题措词不当,因为如果你
导入pkg.*
,你当然可以从包
pkg.B
pkg.C
导入类。也就是说,这样做完全可以:

import pkg.*;
import pkg.B.*;
import pkg.C.*;
但是我假设您真正想问的是,如果您
导入pkg.*
它不会自动导入
pkg
的子包中声明的类型,那么为什么呢。要回答这个问题,最好求助于:

软件包的分层命名结构旨在便于以常规方式组织相关软件包,但其本身没有任何意义,除非禁止子软件包具有与该软件包中声明的顶级类型相同的简单名称(§7.6)

例如,名为
oliver
的包与另一个名为
oliver.twist
的包之间,或者名为
evelyn.wood
的包与
evelyn.waugh
的包之间,没有特殊的访问关系。也就是说,与任何其他包中的代码相比,名为
oliver.twist
的包中的代码对包
oliver
中声明的类型没有更好的访问权限


换句话说,当您导入pkg.时,您正在导入由名为
pkg
的包中包含的编译单元定义的所有顶级类型,但您没有导入
pkg
的任何子包(例如
pkg.B
pkg.C
)。

您的问题不清楚。尽管存在明显的层次结构,但包之间并没有太多的关系;事实上,您有
pkg
pkg.B
并没有以任何有用的方式将它们联系起来。您试图导入到哪个类,以及“不允许”是什么意思?这样做有什么不对?消除了我的疑虑..TXT没有包层次结构
my.package
my.otherpackage
完全不同,这很好?而且很明显?我不知道你对一个四年前的答案的评论是什么意思。请读最后一段。一个包独立于所有其他包。