0

我正在阅读我能找到的每一个教程以及一本书,仍然琐碎的概念让我提出问题:

  1. CLASSPATH是一个在 JVM 中注册的变量,它告诉 java 开始查找 classes/jars/etc 的根目录?

  2. import类似于 include (C/C++) 但通过包提供命名空间?我刚刚阅读了如何在不使用 import 的情况下为每个类(使用 FQCN)显式声明包/命名空间,例如 java.util.String (可能是无效的借口),因为使用 import java.util 将允许我在其他任何地方代码简单地将类称为字符串。

让我对导入感到困惑的是一些使用导入的示例,例如:

import java.util.*;  // import all public classes from java.util package
import java.util.Hashtable;  // import only Hashtable class (not all classes in java.util   package)

是的,这篇文章也跟进了:

请注意,我们可以调用存储在包级别的公共类,我们只进行导入。我们不能使用任何属于我们导入包的子包的类。例如,如果我们导入包world,我们可以只使用HelloWorld类,但不能使用HelloMoon类。

那么,当我在导入中使用 * 时,是不是递归地导入所有子包?

4

4 回答 4

1

你是对的。

与 C/C++ 包含不同,Java 的导入是可选的,因为 Java 会加载它在 CLASSPATH 中找到的所有类。

Java 的 import 语句允许您为常用类起别名,因此您不必每次都完全限定它们。

假设您定义了以下类:

package com.foo.bar;

public class Bazz {
    public static final int ONE = 1;
    public static final int TWO = 2;
    public static final int THREE = 3;

    ... some methods ...
}

有几种使用导入的方法:

import com.foo.bar.*;  // import all classes belonging to package com.foo.bar, and com.foo.bar only.
import com.foo.bar.Bazz;  // import class com.foo.bar.Bazz only
import static com.foo.bar.Bazz.*;  // import all static constants in class com.foo.bar.Bazz
import static com.foo.bar.Bazz.ONE;  // import static constant com.foo.bar.Bazz.ONE only

正如您所说,没有办法递归导入包。

顺便说一句,大多数 IDE 会为您自动导入类。例如,当您按 CTRL+SHIFT+O 时,Eclipse 会执行此操作。

于 2012-09-14T13:34:18.810 回答
1

7.5.2. 按需类型导入声明

import java.util.*;

使包 java.util 中声明的所有公共类型的简单名称在编译单元的类和接口声明中可用。因此,简单名称 Vector 指的是包 java.util 中的类型 Vector 在编译单元中该类型声明未被遮蔽(第 6.4.1 节)或隐藏(第 6.4.2 节)的所有位置。

该声明可能会被简单名称为 Vector 的类型的单一类型导入声明所遮蔽;由一个名为 Vector 的类型,并在编译单元所属的包中声明;或任何嵌套的类或接口。

声明可能会被名为 Vector 的字段、参数或局部变量的声明所掩盖。

(发生任何这些情况都是不寻常的。)

于 2012-09-14T13:27:25.257 回答
0

是的。这就是它的作用。
但最好在import语句中提供绝对路径。

于 2012-09-14T13:35:12.373 回答
0

正如您在问题中提供的示例一样,当您指定

import java.util.*;

您导入 java.util 包中的所有公共类。您不导入驻留在 java.util 包之外的任何公共类。

像 Eclipse 这样的集成开发环境 (IDE) 将为您创建单独的类导入。没有太多理由再编写全局导入(带有星号)了。

于 2012-09-14T13:29:01.120 回答