递归导入Java

Und*_*Dog 4 java

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

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

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

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

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

Ted*_*opp 9

你的问题是措辞不当,因为如果你import pkg.*,你肯定被允许然后从包导入类pkg.B和pkg.C.也就是说,这样做非常好:

import pkg.*;
import pkg.B.*;
import pkg.C.*;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


sgb*_*gbj 5

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

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

首先,包似乎是分层的,但它们不是.例如,Java API包括java.awt包,java.awt.color包,java.awt.font包以及许多以java.awt开头的包.但是,java.awt.color包中包含java.awt.color包,java.awt.font包和其他java.awt.xxxx包.前缀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.*;
Run Code Online (Sandbox Code Playgroud)