Java中package的概念及实践(不使用IDE)

2,463 阅读3分钟

一、package 在 Java 中是什么作用?

为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。

包的作用:

  1. 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  2. 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
  3. 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

一般情况下,包名采用公司域名的倒写来命名,比如 com.baidu,com.alibaba。包名在我们的操作系统中就对应于./com/baidu./com/alibaba 这样的文件夹目录结构。

二、不通过 IDE 来进行 package 的编译和运行

  1. 新建两个测试用例,其中一个 class 会调用另一个 class 里的方法
    我这里在 E:\java\06 目录下新建了两个类 ClacLogic.javaClac.java
package clacapp.logics; //定义 ClacLogic 类在包 clacapp/logics 下

public class ClacLogic {
	
	public static int tasu(int a, int b) {
		return a + b;
	}
	
	public static int hiku(int a, int b) {
		return a - b;
	}
}
package clacapp.main; //定义 Clac 类在包 clacapp/main 下

import clacapp.logics.ClacLogic; //因为 ClacLogic 不和 Clac 同一包,所以使用时需要导入

public class Clac {
	
	public static void main(String[] args) {
		int a = 10;
		int b = 2;
		int total = ClacLogic.tasu(a, b); //调用 ClacLogic 的 tasu 方法
		int delta = ClacLogic.hiku(a, b); //调用 ClacLogic 的 hiku 方法
		System.out.println("plus is " + total + " ,minus is " + delta);
	}
}

第一步已经建好了两个 .java 文件。

  1. 进行编译
    对上一步建好的两个 java 文件进行编译,这里需要注意,不能直接使用 javac xxx.java 命令(具体为何可以自己尝试并思考),要使用 javac -d 路径 xxx.java

    先来到之前创建的 .java 文件当前目录,我这里是 E:\java\06。然后分别执行命令 javac -d . ClacLogic.javajavac -d . Clac.java(注意先后顺序)。

    在命令执行完成后,会看到自动生成了名为 clacapp 的目录,该目录下又存在两个目录 logicsmain,里面则是我们编译出来的 ClacLogic.classClac.class文件。到这里你是否发现了我们一开始写在 .java 文件中第一行的 package xxx.xxx; 与 Java 进行编译时的联系呢。

    javac -d 目录 xxx.java 命令中目录的含义是你想让编译后自动生成的文件夹从哪个目录开始,. 就代表当前目录,也就是告诉编译器在 E:\java\06 下创建对应的 package 。

  2. 执行 .class 文件
    这一步也需要注意,之前使用 java xxx 命令运行 .class 文件就可以了,但是使用带有 package 编译出来的 .class 文件,需要来到 package 的上层目录(可以类比为项目根目录),这里也就是 E:\java\06 。在当前目录运行 java clacapp.main.Clac ,看到输出结果: plus is 12 ,minus is 8

三、总结

本篇文章简单介绍了如何编译和运行一个带有 package 的 java 文件,通过使用命令行的原始方法来理解 package 。这里介绍的例子只是涉及编译和运行,没有囊括 package 的多方面作用,大家可以自己去编写 Demo 来更深入理解 package 在多种场景下的作用。

其实package的本质就是帮助我们来定义编译后的.class文件的具体位置,也就是放在哪个文件夹下。