# 介绍

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

# 目的

  • 管理组织项目: 将功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用
  • 防止命名冲突: 解决多人协作开发时,命名冲突的问题。包创建了新的命名空间(namespace),不同包中可以存在重名的类
  • 访问控制: 包同时也提供了访问权限控制

提示

一个包相当于对应一个文件夹,包也采用了树形目录的存储方式

# 使用

# 定义

  • 包的声明应该在源文件的第一行
  • 通常使用小写字母进行包的定义
  • 使用.表示子目录
 




package pkg1.pkg2.pkg3;

public class SomeClass {
}
1
2
3
4

# 导入

  • 为了使用某个包中的成员,我们需要借助import关键字进行包中类的导入
  • 如果在同一个包(同一个目录)下,则无需导入,可以直接使用
  • import声明必须在包声明之后,类声明之前
  • 可以使用通配符*,导入包中全部的类

注意

  • 使用通配符*进行导入,实际上不存在性能上的问题。只是自动导入所需要的类,不需要的不导入
  • 如果需要同时使用不同包中相同类名的类时,应加上包名加以区分
package pkg5;

import pkg1.pkg2.pkg3.SomeClass;
import pkg1.pkg2.pkg4.SomeClass;

public class AnotherClass {
    public static void main(String[] args) {
        pkg1.pkg2.pkg3.SomeClass sc1 = new pkg1.pkg2.pkg3.SomeClass();
        pkg1.pkg2.pkg4.SomeClass sc2 = new pkg1.pkg2.pkg4.SomeClass();
    }
}
1
2
3
4
5
6
7
8
9
10
11

提示

可以使用javac -d . *.java来编译并为.class文件,并依据包,自动生成目录

  • -d: 表示根据package定义生成目录
  • .: 表示目录的生成位置,.表示当前所在目录

注意,此时执行*.class文件时,必须使用完整名称,即带包名执行
java pkg1.pkg2.Driver

# 静态导入

如果一个类中的方法全是静态方法,则通常使用方式如下:

 








 









// ./util/MyMath/Function.java
package util.MyMath;

public class Function {
    public static int add(int n1, int n2) {
        return n1 + n2;
    }
}

// ./driver/Test.java
package driver;
import util.MyMath.Function;

public class Test {
    public static void main(String[] args) {
        int sum = Function.add(1,2);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

以上使用方式是JDK1.5之前采用的,现在也可以使用,JDK1.5之后引入了静态导入的特性

静态导入

  • 要求类中的方法都是静态方法
  • 调用类中静态方法时,可以省略类名称
// ./driver/Test.java
package driver;
import static util.MyMath.Function.*;  // 静态导入

public class Test {
    public static void main(String[] args) {
        int sum = add(1,2);            // 调用时无需类名称
    }
}

1
2
3
4
5
6
7
8
9
10

# jar

通常一个项目开发完成后,存在大量的.class文件,不便于直接交与用户使用

  • 容易损伤硬盘
  • 数据传输慢
  • 维护困难

JAR文件(Java Archive)相当于一种压缩文件格式,可将多个文件合成一个文件,是一种与平台无关的文件格式

JAR文件与zip文件的区别在于JAR文件中默认包含了一个名为MANIFEST.MF的清单文件,在生成JAR文件时由系统自动创建,该文件可以用于指定主类

# 作用

  • 压缩文件大小,加快传输速度(无需为每一个文件建立一个HTTP连接)
  • 用于打包发布和使用类库
  • 创建可执行JAR

# 使用

  • 作为类库使用时,需要进行CLASSPATH的配置
    • 自动根据CLASSPATH进行路径中的*.class文件加载
    • .jar文件等同于一个目录
    • SET CLASSPATH=.;E:\xxx\xxx.jar
  • 作为可执行JAR包使用时,需要指定主类

# 参考

[1] Java菜鸟教程 (opens new window)

[2] 阿里云大学 | 李兴华 - Java语言基础 (opens new window)

Last Updated: 7/1/2020, 2:19:02 AM