递归导入Java

时间:2013-08-15 02:38:22

标签: java

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

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

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

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

我想了解Java中不允许我进行递归导入的理由。

4 个答案:

答案 0 :(得分:9)

您的问题措辞不当,因为如果您import pkg.*,您当然可以从包pkg.Bpkg.C导入类。也就是说,这样做非常好:

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

但是我假设你真正问的是为什么,如果你import pkg.*它不会自动导入pkg子包中声明的类型。要回答这个问题,最好转向Java Language Specification

  

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

     

例如,名为oliver的包与另一个名为oliver.twist的包之间或名为evelyn.woodevelyn.waugh的包之间没有特殊的访问关系。也就是说,名为oliver.twist的包中的代码无法更好地访问包oliver中声明的类型,而不是任何其他包中的代码。

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

答案 1 :(得分:5)

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

最好用this tutorial解释

  

首先,包似乎是分层的,但它们不是。对于   例如,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抽象窗口   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.*;

答案 2 :(得分:1)

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

答案 3 :(得分: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.*等。这就是语言的设计方式。