包与导入

前面学了 Java 的基础语法,你可能已经在代码示例中见过 import java.util.Scanner 这样的语句了。这篇文章来系统讲讲 Java 的包(package)和导入(import)机制:Java 怎么组织代码,怎么引用标准库里的类,以及多文件项目如何协作。

Java 的包(package)

Java 用(package)来组织代码,你可以把包理解为"文件夹"。每个 .java 文件的开头可以用 package 声明自己属于哪个包:

// 声明这个文件属于 com.example.utils 包
package com.example.utils;

public class MathUtils {
    // ...
}

包名和目录结构必须一一对应:package com.example.utils 意味着这个文件必须放在 com/example/utils/ 目录下。

同一个包内的类可以直接互相使用,不需要 import。但要使用其他包的类,就需要 import 了。

不过刷题时基本不需要写 package 声明,因为你的代码都在"默认包"里,直接写 public class Main 就行。理解包的概念,主要是为了知道 import 在做什么。

import 导入

当你要使用其他包里的类时,需要用 import 语句把它引入进来。import 写在 package 声明之后、类定义之前。

有两种写法:

// 精确导入:只导入一个类
import java.util.ArrayList;
import java.util.HashMap;

// 通配符导入:导入包下所有的类
import java.util.*;

两种写法的效果一样,通配符 * 只导入当前包的类,不会递归导入子包。刷题时用 import java.util.* 一行搞定最方便。

有一个特殊的包 java.lang,它会被自动导入,不需要你写 import。StringSystemMathIntegerStringBuilder 这些常用类都在 java.lang 里,所以你可以直接用。

刷题常用包一览

下面列出刷题中最常用的 Java 标准库包,让你知道"有哪些东西可以用"。具体的用法和示例会在后续的 常用数据结构算法题常用技巧 章节中详细介绍。

包名用途典型类
java.util集合框架ArrayListHashMapPriorityQueueArrays
java.io输入输出BufferedReaderInputStreamReader
java.math大数运算BigInteger
java.lang(自动导入)基础类StringMathIntegerSystem

实际刷题时,大多数情况下一行 import java.util.*; 就够了。需要快速 I/O 时加上 import java.io.*;,需要大数运算时加上 import java.math.*;

多文件与包结构

在实际项目中,Java 代码会按包组织成多个文件。每个 .java 文件只能有一个 public 类,文件名必须和类名一致。

通过 package 声明自己的包名,通过 import 引入其他包的类,多个文件就能协作起来。

下面是一个完整的多文件示例,Main.java 通过 import 引入自定义包中的工具类:

了解了包和导入之后,下一篇我们来讲 方法与面向对象基础,学完之后你就能理解 Java 代码中的 classnewthis 等关键字了。