我们也许知道,Java引入包机制,提供了类的多层命名空间,解决了类的命名冲突、类文件管理等问题。但是总会出现一些问题。
问题一
E:\Demo\java 中的文件有:Zi.java、Test.java两个文件
Zi.java中代码如下:
public class Zi { public void print() { System.out.println("abc"); } }
Test.java中代码如下:
import com.Zi; public class Test { public static void main(String[] args) { new Zi().print(); } }
在dos窗口中编译Zi.java,【javac -d . Zi.java】,之后。发现Zi.class文件在当前目录中,于是我新建了一个com文件夹并将该类文件放入其中
然后,编译Test.java,【javac Test.java】,编译出错:
E:\Demo\java>javac Test.java
Test.java:2: 无法访问 com.Zi
错误的类文件: .\com\Zi.class
类文件包含错误的类: Zi
请删除该文件或确保该文件位于正确的类路径子目录中。
import com.Zi;
为什么会出现这样的错误呢?查找资料后给出的是以下解释:
很多初学者以为只要把生成的class文件放在某个目录下,这个目录名就成了这个类的包名。这是一个错误的看法,不是有了目录结构,就等于有了包名。为Java类添加包必须在Java源文件中通过package语句指定,单靠目录名是没法指定的。因此,Java的包机制需要两个方面保证:1、源文件里使用package语句指定包名;2、class文件必须放在对应的路径下。
问题二
import static 有何作用?
这是JDK1.5以后增加的一种静态导入语法,它用于导入指定类的某个静态field、方法或全部的静态Field、方法。这里所指的静态field、方法就是类属性、类方法。
import与import static的作用:使用import可以省略包名,而使用import static则可以连类名都省略。
import static java.lang.System.*; import static java.lang.Math.*; public class Test { public static void main(String[] args) { //out是java.lang.System类的静态Field,代表标准输出 //PI是java.lang.Math类的静态Field,表示π常量 out.println(PI); //直接调用Math类的sqrt静态方法 out.println(sqrt(256)); } }