6

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

让我们假设包“pkg”包含以下内容

  • A类,
  • 包 B(这又包含 B1 类)
  • 包 C(这又包含 C1 类)

如果我使用import pkg.*为什么我不允许从包“B”和“C”导入类?

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

4

4 回答 4

11

你的问题措辞不好,因为如果你import pkg.*,你当然可以从包pkg.Bpkg.C. 也就是说,这样做完全没问题:

import pkg.*;
import pkg.B.*;
import pkg.C.*;

但是我假设您真正要问的是为什么,如果您import pkg.*没有自动导入在pkg. 要回答这个问题,最好求助于Java 语言规范

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

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

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

于 2013-08-15T02:52:16.220 回答
6

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

本教程最好地解释了这一点,它说

起初,包似乎是分层的,但实际上并非如此。例如,Java API 包括一个 java.awt 包、一个 java.awt.color 包、一个 java.awt.font 包以及许多其他以 java.awt 开头的包。但是,java.awt.color 包、java.awt.font 包和其他 java.awt.xxxx 包不包含在 java.awt 包中。前缀 java.awt(Java Abstract Window Toolkit)用于许多相关包以使关系明显,但不显示包含。

更重要的是,

导入 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.*;
于 2013-08-15T02:50:26.087 回答
1

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

于 2013-08-15T02:46:58.150 回答
0

正如您在原始问题(编辑之前)中描述的那样,对进口没有限制。

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

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.*等。这就是语言的设计方式。

于 2013-08-15T02:45:17.370 回答