Java引入了包(pacakage)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。
package chap5_3;
public class Hello {
public static void main(String[] args)
{
System.out.println("hello world");
}
}
Java规定:位于包中的类,在文件系统中也必须有与报名层次相同的目录机构。
java -d .Hello.java
对于上面的Hello.class,它必须放在chap5_3文件夹下才是有效的,当使用-d选项的javac命令来编译Java源文件时,该命令会自动建立对应的文件结构来存放相应的class文件。
如果编译Java文件时不使用-d选项,编译器不会为Java源文件生成相应的文件结构。
进入编译器生成的chap5_3文件夹所在路径,执行如下命令:
java chap5_3.Hello
看到上面程序正常输出。
注:同一个包中的类可以位于不同的目录中,只要让CLASSPATH环境变量里包含这两个路径即可。虚拟机会自动搜索CLASSPATH下的子路径,把它们当成同一个包下的类来处理。
Java的包机制需要两个方面保证:1.源文件里使用package语句指定包名。2.class文件必须放在对应的路径下。
注:包名应该全部是小写字母,而且应该由一个或多个有意义的单词连缀而成。
一个源文件只能指定一个包,即只能包含一条package语句,该源文件中可以定义多个类,则这些类将全部位于该包下。
package chap5_3;
public class HelloTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Hello h=new Hello();
}
}
父包和子包在用法上不存在任何关系,如果父包中的类需要使用子包中的类,则必须使用子包的全名,而不能省略父包部分。
import可以向某个Java文件中导入指定包层次下某个类或全部类。多个import语句用于导入多个包层次下的类。
使用import chap5_3.*;语句后,它表明导入chap5_3包下的所有类。
一旦在Java源文件中使用import语句来导入指定类,在该源文件中使用这些类时就可以省略包前缀,不再需要使用全类名。
System类使用时无需使用import语句来导入这些类,Java默认为所有源文件导入java.lang包下的所有类。而使用数组时使用的Arrays类,位于java.util包下, 需要导入。
静态导入使用import static语句,使用import可以省略包名,而使用import static则可以连类名都省略。
package chap5_3;
import static java.lang.System.*;
import static java.lang.Math.*;
public class StaticImportTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
out.println(PI);
out.println(sqrt(256));
}
}