Java 包机制

包机制

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为<path>\classes,包名为com.example.aaa,那么编译器与jvm找寻包下class文件的的路径为

<path>\classes\com\example\aaa

class path可以通过分号包含多个路径。

详细教程:https://docs.oracle.com/javase/tutorial/java/package/index.html

猜你喜欢

转载自blog.csdn.net/qq_32165041/article/details/82148629