包机制
Java 包机制本质上是提供了一种命名机制。
包的好处:
方便类型的查找与使用
避免命名冲突
控制访问
可以装入包的类型为:
class、interface、annotation、enumeration
将类型装入包时,最好根据功能进行装包。
eg:有关读写的类型装入java.io包内。
创建包
将类型放入包中
package graphics;
public abstract class Graphics{
}
note:将Graphics放入graphics包中。
ps:在需要放入包中的文件之中,最初的代码便是此代码。
当一个文件中同时定义了多个类时,只能有一个类为public,并且这个类的类名与文件名相同。其他的非public类,无法从package外进行访问。
如果一个类型文件中没有使用package文件,那么这个类位于未命名的默认包中。一般来说,不建议这样做。
命名包
一般来说,使用类时,如果类的名称相同,会产生了冲突。
eg:需要使用Hello类,但是存在两个Hello.java文件。
使用包机制可以解决这种冲突,即同名不同包。
放入包的类,在使用时需要使用完整类名,以此解决命名冲突。
完整类名=包名.类名
eg:放入aaa包的Hello类,使用时,通过aaa.Hello来调用。
当多个应用出现时,可能会出现包名类同全相同的情况,这时,命名冲突会产生。
通过包的命名习俗可以解决这种冲突。
包的命名习俗
包名一律使用小写字母。
公司使用反转的互联网域名作为编写的包名的开始。eg:com.example.aaa下的Hello类。
公司内部如果发生类命名冲突,可以使用region或项目名,eg:com.example.region.aaa下的Hello类。
java语言中的包,使用java、javax。
如果互联网域名因一些特殊原因无法使用,eg:域名中包含-,域名中包含保留字等。可以使用下划线将域名转化成可以使用的类型。
使用包内成员
包中包含的类型(eg:class、interface等)被称为包的成员。
跨包访问包内成员时,只有public类型才能被使用。
在使用一个未被import的其他包的成员时,可以通过完整类名来使用这个成员。
eg:aaa.Hello hello = new aaa.Hello();
引用一个外部包内的特定成员时,可以使用import语句。
import aaa.Hello;
note:引用aaa包下的Hello类型。
ps:import语句放在package语句之后,类型定义语句之前。
ps:使用过import语句之后,在使用引用类型之时就无需使用完整类型名。eg:Hello hello = new Hello():
可以一次性引用一个完整的包,那么这个包下的所有类型全部都可以直接使用。
import aaa.*;
note:引用完整的aaa包。
ps:引用一个包时,其子包下的类型不会被引入。eg:import aaa.*;不会引入aaa.bbb下的类型。
ps:引用一个可以通过 import aaa.Hello.*;引入定义在Hello中的嵌套类型。
包机制看上去像是分层的,但实际上并不是分层的。
eg:java.awt、java.awt.color、java.awt.font,java.awt并不包含其他两个包。所以,即使引入了java.awt,也不会引入其他两个包内的类型。其他两个包使用java.awt作为包前缀,可以表示这三个包在功能上是互相关联的,但也仅此而已。
当使用import引用的多个包中具有共享相同名称的类型时,代码中使用类型的简单名称会引发错误。
eg:aaa包中有Helle类,bbb包中有Hello类,同时引入aaa包与bbb包,那么 Hello hello = new Hello();这句语句就会引发错误。
这个错误,可以通过使用完整类型名来解决。
eg:使用aaa.Hello hello = new aaa.Hello();便可以解决这个问题。
使用静态引用来引入其他类型中定义的静态常量与静态方法。
eg:
import static java.lang.Math.*;
or
import static java.lang.Math.PI;
使用静态引用的文件中,用到引用的静态常量与静态方法时,便可以不再使用完整类名。
eg:double r = cos(PI*theta);
使用静态引用需要适度,如果在一个文件中使用大量的静态引用,就无法分清每一个静态常量与方法究竟是出自哪一个被引用的类型。
管理源文件与class文件
java 语言规没有要求需要使用依赖层次的文件系统管理源代码与class文件,但是很多给予java平台的实现使用这一策略。
这种方法,使用与包名相同的子文件名,来分层管理不同包下的文件。
eg:com.example.aaa.Hello作为一个java文件,放在com\example\aaa文件下,编译后的class文件,放在com\example\aaa下。
用来存放java文件的路径不必与存放class文件的路径相同,这种方法可以用来隐藏源代码。
eg:one\com\example\aaa下存放Hello.java,two\com\example\aaa下存放Hello.class。
存放class文件的路径被称为class path。
将class path设置为环境变量CLASSPATH使得jvm与java编译器构建找寻class文件的完整路径。
eg:class path为
class path可以通过分号包含多个路径。
详细教程:https://docs.oracle.com/javase/tutorial/java/package/index.html