package
import只是一种让你偷点懒少打字的方法,绝对不会影响你的classpath,没有非用import不可的理由,用了import也不会起到类似c里面嵌入某文件内容的效果,它只是一种省事的办法。不在classpath中的class,任你再import也无济于事。
如果你不用import,你用ArrayList这个类,就需要写 java.util.ArrayList。而用了import java.util.ArrayList;的话以后代码中写ArrayList就可以了,省事。
import可以使用通配符*,*代表某package下所有的class,不包括子目录。import java.awt.* 不等于 import java.awt.*;import java.awt.event.*;如果你要简写java.awt.event下和java.awt下的类,你不能偷懒,两个都要import。
接下来是另外一篇中的内容,来自 http://www.knowsky.com/363549.html 的最后几段:
不管你有没有使用import指令,存在目前目录下的类都会被编译器优先采用,只要它不属于任何package。这是因为编译器总是先假设您所输入的类名就是该类的全名(不属于任何package),然后-classpath所指定的路径中搜索属于该类的.java文件或.class文件,在这里可以知道default package的角色非常非凡。
必须明确告诉编译器我们用到哪个package下的类,导入时或在包名称.类名称中进行引用。导入某个包时,一定要进行-classpath路径指定某个包的位置。你假如指定了多个路径话,假如在一个路径下已经找到了该包话,就优先引用该包的类。
当java编译器开始编译某个类的源代码时,首先它会做一件事情,这就是建立“类路径引用表”,它是根据参数-classpath或classpath环境变量来建立的。假如没有指定选项-classpath或环境变量CLASSPATH时,缺省情况下类路径引用表只有一条记录,即当前的目录(“.”)。环境变量CLASSPATH的内容会被选项-classpath所覆盖,没有累加效果。当编译器将类路径引用表建立好之后,接着编译。
OK,这里犯懒,只做了一个简单的测试:
如果myjava目录所在的路径已经在CLASSPATH中了,然后我们有package pkg在../myjava/mypkg/pkg的路径下,然后有ClassA.java和ClassA.class在pkg下。这时,如果在另一个工作目录下,我们有ClassE.java,这个文件中没有import 语句,但是有使用ClassA的语句,如 mypkg.pkg.ClassA a = new mypkg.pkg.ClassA(); 是同样可以正常工作的。
所以总结下来应该有:
1) java编译器在编译时,建立“类路径引用表”,来自CLASSPATH环境变量或者 -classpath参数;默认包含当前目录,即' . '。
2) 不一定要用import语句,使用 path1.path2.path3.ClassA 的方式也可以达到使用指定类的目的,path1.path2.path3.ClassA的方式,其实也是告诉编译器按照 path1/path2/path3/ 的目录路径去找 ClassA.class 文件。当然,你可以把这个路径所在的“根目录”加到CLASSPATH或者-classpath中,然后import,就不用每次引用一大长串了。这就是import的作用吧。
3) 很遗憾,通配符*竟然只能匹配当前目录下的文件,而不包含子目录,也就是说' * ' 其实指代的是 ' *.class '。