产生原因
- 避免
.java 文件
中类/接口/静态方法/静态成员变量的同名冲突 - 便于对
.class文件
分类管理
含义
package(包)起限定和管理功能:
- 逻辑上名称限定: 在本 .java 文件外使用类、接口、静态方法、静态成员变量时,相应类、接口、静态方法、静态成员变量的名字必须使用完全限定名。
- 物理上位置限定: 执行 java 命令时 .class 所在且必须在的文件夹(或文件夹路径) 。由于 javac 的查找路径为当前文件夹和classpath文件夹,所以包限定了 .class 文件相对于当前文件夹和 classpath 文件夹的文件路径。
特别地:
- 没声明包时,.class文件必须在当前文件夹下或者classpath文件夹内。即类名的完全限定名称为
包名.类名
- 同一个包中的两个类,不必要在相同路径下,只需要在当前文件夹或 classpath 文件夹下的包对应路径下即可。如 test.test1.DemoA.class 和 test.test1.DemoB.class,可以分别在C盘和D盘某个位置下的test\test1文件夹下,只要这两个位置在 classpath 或是当前文件夹中
- 包只是对 .java 文件中名称的限定,对 .class 位置的限定,和继承等逻辑关系没有关系
语法
// 示例
package test.test1;
class DemoA {}
-
声明:
package 包名;
- 一个源文件中只能有
一个
包声明语句,且其必须是源文件的第一条
非注释性语句 - 包名可以使多级路径,如 package test.test1; 为二级路径
- 从可读性规范角度来看,包名应全部为小写字母。且建议公司使用其域名倒写作为包名。
- 一个源文件中只能有
-
编译:
javac [-d 任意路径] 类名.java
- 无需指定包名,自动生成包对应文件夹
示例如下:
- javac -d e:java a.java,会在e:java目录下自动生成test\test1文件路径,并将.class存放在其中
- javac DemoA.java ,会在当前文件夹下生成 DemoA.class ,而没有相应的包路径生成,需手动将 .class 文件放在相应包对应的路径下
-
运行:
java 包名.类名.class
- 需要显示指定包名
示例:java test.test1.DemoA.class
-
外部文件使用:
-
直接使用
需要使用连带报名的完全限定名
-
用import简化名称
import 包名.类名/接口名;
import static 包名.类名.静态方法/静态变量;
-
功能: 给对应的类、接口、静态方法或者静态成员变量自动加上包名,从而在编写程序时,可以省略包名,简化名称书写。
-
位置: 出现在package声明之后,类定义之前,可以有多个import语句
-
示例:
import test.test1.DemoA;//简化test\test1中的DemoA类 import test.test.*; //简化test\test1中的所有类,不包括子文件夹中的类,即*只代表类,不代表包 import static test.DemoA.class.num; //简化类中的静态成员变量 import static test.DemoA.class.show();//简化类中的静态方法 import static test.DemoA.class.*; //简化中所有静态成员
-
注意事项:
-
Java 默认:import java.lang.*
-
不能有同名类被简化名称。当出现这种情况时,必须使用一个类使用带有包名的类的全名
-
存在包含关系的包,使用时名称也不能简化。
import test.test1.DemoA; //不能简化为 import test1.DemoA; package test; class Demo {}
-
-
-
常见问题
为什么不能import非static方法和成员变量
因为非static方法或成员变量必须建立对象后,通过特定对象调用,没法像static方法一样,直接通过类就可以调用,所以无法实现import直接简化名称