学习Java - 导入和打包基础知识

时间:2012-09-14 13:23:29

标签: java

我正在阅读我能找到的每一个教程以及一本书,还有一些琐碎的问题让我提出问题:

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

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

  3. 让我对导入感到困惑的是一些使用import的例子:

    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 个答案:

答案 0 :(得分:1)

7.5.2. Type-Import-on-Demand Declarations

import java.util.*;
  

导致java.util包中声明的所有公共类型的简单名称在编译单元的类和接口声明中可用。因此,简单名称Vector指的是编译单元中所有位置的java.util包中的Vector类型,其中该类型声明未被镜像(第6.4.1节)或模糊(第6.4.2节)。

     

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

     

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

     

(任何这些情况都会发生。)

答案 1 :(得分:1)

你是对的。

与C / C ++ include不同,Java的import是可选的,因为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会执行此操作。

答案 2 :(得分:0)

与问题中提供的示例一样,指定

import java.util.*;

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

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

答案 3 :(得分:0)

是。这就是它的作用。
但最佳做法是在import陈述中提供绝对路径。