当使用javac编译源文件时,如何查找import导入的类
当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转移单元)。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件名称一致。每个编译单元只能有一个public类,否则编译器就不会接收。如果在该编译单元之中还有额外的类,那么在包之外无法看见这些类,这是因为它们不是public类,而且它们主要用来为主public类提供支持。
java解释器的运行过程:
- 找出环境变量CLASSPATH,CLASSPATH包含一个或多个目录,用作查找.class文件的根目录
- 从根目录开始,解析器获取包的名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称。以cn.example.simple为例,它会转换成cn\example\simple
- 得到的路径会与CLASSPATH中的各个不同的项相连接,解析器就在这些目录中查找与你所要创建的类名称相关的.class文件
例子:
使用包名:cn.example.simple,在该名称空间下,新建两个类:
package cn.example.simple; public class Vector{ public Vector(){ System.out.println("cn.example.simple.Vector"); } }
package cn.example.simple; public class List{ public List(){ System.out.println("cn.example.simple.List"); } }
将这两个文件置于目录:C:\DOC\JavaT中,设置CLASSPATH,如下:
CLASSPATH=.;C:\DOC\JavaT
一旦类路径确立,测试文件就可以放在任何目录下:
import cn.example.simple.*; public class LibTest{ public static void main(String[] args){ Vector v = new Vector(); List l = new List(); } }/*output: cn.example.simple.Vector cn.example.simple.List */
分析:
当编译器碰到simple类库的import语句时,就开始在CLASSPATH所指的目录中查找,查找子目录cn\example\simple,然后从已编译的文件中找出名称相符.class文件。
注意:
无论何时创建包,都已经在给定的包名称的时候隐含地指定了目录结构。这个包必须位于其名称所指定的目录之中,而该目录必须是以CLASSPATH开始的目录中可以查询到。
编译过的代码通常放置与源代码的不同目录中,但是必须保证JVM使用CLASSPATH可以找到该路径。